06.14 Python 魔术方法和运算符重载

Python 的魔术方法其实也不是什么魔法。

魔术方法的名称前后各有两个下划线,例如类初始化函数 __init__ 就是个魔术方法。你不必直接调用它,当初始化一个类的时候,Python 背后会自动执行 __init__ 方法。

例如一条语句:x = A(),就会自动执行类 A 的魔术方法 __new__ 和 __init__。查看下面例子:

输出:

使用语句 a = A(1, 2, foo='bar') 创建对象,会自动执行类 A 的 __new__ 和 __init__ 方法。

__new__ 方法打印了输入参数,最后调用 return super().__new__(cls) 获取对象。

__init__ 方法的第一个参数 self 正是 __new__ 方法创建的实例对象。

__call__ 方法

__call__ 方法可以使类的实例像对象像函数那样调用,正常函数(Function)是可调用的(callable),实现了__call__ 方法的对象,也是可调用的(callable object)。

下面的代码定义了一个类,它的实例可调用:

类 A 接收一个初始化参数 x,然后定义了 __call__ 方法,接收一个参数,返回两个参数之和。

使用 a = A(10) 实例化对象后,对象 a 可以像函数一样调用,输入值2,然后调用 __call__方法,和对象的属性 x 相加得12

运算符重载

运算符加号 +,当两个整数类型相加,返回他们的和。 当两个序列类型相加,返回一个新序列,包含所有的值。

我们也可以重载 + 运算符运用在自己创建的类中,达到特殊的目的。要想实现这样的操作,需要定义和运算符相关的魔术方法,例如加法 + 对应的魔术方法是 __add__,减号 - 对应的魔术方法是 __sub__。如果忘记定义,会抛出类型错误异常。

以上没有定义任何魔术方法的类,实例相加抛出类型错误,不支持的运算符类型 +

运算符魔术方法概览

二元运算符 Binary Operaters

扩展赋值运算符 Extended Assignment

一元运算符 Unary Operator

比较操作符 Comparison Operator

例子

下面的例子实现了加法 + 的运算符重载。

类 A 实例化了两个对象,对象相加调用魔术方法 __add__,返回两个对象的属性 x 的和。