
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.2.2 魔术方法
类可以定义一些特殊方法,称为魔术方法(magic method)或双划方法(双下划线的简写)。这些方法通常不会由我们直接调用,而是由Python在底层使用,我们将在下面的示例中看到。
我们使用过这种方法:__init__,在实例化对象时使用它作为初始化语句。__init__方法定义了创建类的实例时执行的代码。
魔术方法的一个著名用法(本书将会大量使用)是重载运算符。让我们通过一个例子来看一看。假设我们创建了一个表示复数的类:

如何在ComplexNum的实例上实现加法操作?方法一是添加一个plus方法:

可以像下面这样使用:


这是可以的,但是如果能像对数字那样使用+运算符,显然会更好:

Python包含一个魔术方法__add__。如果创建了这个方法,我们就可以使用+运算符,Python将在后台调用__add__方法。因此,如果我们将plus重命名为__add__,就可以使用+运算符对ComplexNum进行加法操作了:

我们可以在类中创建更多的魔术方法,来执行减法、除法、比较等。你可以快速浏览一下表4-1,看一看魔术方法可以实现的操作。例如,创建__sub__方法后就可以使用-运算符简单地计算两个复数的减法:

现在,我们可以使用-运算符:

怎样才能使用==操作符比较实例是否相等呢?创建__eq__方法就行:

这样就可以轻易地比较复数大小了:

本书会使用很多魔术方法,它们确实提高了代码的可读性。
现在,让我们换换话题,学习类型提示。