阅读 46

Python的魔法方法

原文链接:A Guide to Python's Magic Methods

介绍

什么是Python的魔法方法(Magic Methods)?它们就是面向对象的Python中的一切。它们是你可以定义的特殊方法,用来向你的类添加“魔法”。它们通常被双下划线包围(例如,__init____lt__)。它们没有详细的文档记录。所有的Python魔法方法出现在Python文档中的同一部分,但它们分散且组织松散。在该部分几乎找不到示例(这很可能是设计使然,因为它们在语言参考中都由详细的描述,以及无聊的语法描述等)。

因此,为了解决我认为在Python文档中存在的缺陷,我着手为Python魔法方法提供一些更简单的、示例驱动文档。

你可以把本文当作一个简单易于的教程,参考。


构造与初始化(Construction and Initialization)

大家都知道最基本的魔法方法,__init__。这个方法定义了我们如何初始化一个对象。然而,当我们使用语句x = someClass()__init__却不是第一个被调用的方法。事实上,__new__方法才是最先被调用的,它真正创建了对象实例,然后将所有创建对象的参数传递给初始化方法。在对象的生命周期中还有一个魔法方法会被调用,就是__del__

让我们仔细看看这三个魔法方法:

__new__(cls[,...])
__new__是对象实例化过程中第一个被调用的方法。它构造了对象实例,然后将其他参数传递过__init____new__用的相当少,但它还是有它的用处,尤其是当子类化一个不可变的类型如tuplestr。对于__new__不作过多细节探讨,相关细节可以查看Python文档

__init__(self[,...])
类的初始化方法,无论使用什么主构造函数都会通过。

__del__(self)
如果说__new____init__构成了对象的构造器(constructor),那么__del__就是对象的析构器(deconstructor)。它没有实现语句del x的行为(因此,不能转换成x.__del__())。相反,它定义了一个对象被垃圾回收时的行为。它对在对象被清理前需要其他额外的清理工作时十分有用,例如sockets对象或文件对象。但是请小心,因为不能保证对象仍然存在而解释器退出前__del__的执行,因此__del__不能替代良好的编码做法(例如在完成操作后始终关闭连接)。事实上,__del__应该从不被使用,因为它在不稳定的情况下被调用。我们应该谨慎使用它。


魔法方法的用处

让自定义类与表现的和内建类型(built-in type)一样

例如:当我们想比较两个实例时,我们可以通过实现一个equal方法。更好的方法是,我们也可以实现__eq__方法重新定义==的执行操作,使得自定义类也能正确的使用==,这种方法更直观直接。

# 不直观
if instance.equals(other_instance):
    # do something

# __eq__ : Defines behavior for the equality operator, ==.
# 我们可以通过在类中实现__eq__方法,是比较变得更加直观直接
if instance == other_instance
    # do something
复制代码

python中有大量的魔法方法,我们可以通过实现这些魔法方法,重新定义某些操作,使得它能在我们自定义类上生效,表现出与内建类型一样的效果。

关注下面的标签,发现更多相似文章
评论