Python 的 Magic Methods 指南(3)

就如同你可以通过定义比较操作来比较你自己的类实例一样,你也可以自己定义数学运算符号的行为。好吧,先系紧你的裤腰带,深呼吸......,这些操作可多着呢。由于文章组织需要,我把这些数学“魔术方法”分为5类:单目运算操作,一般数学运算操作,满足交换律的数学运算(后面会有更多介绍),参数赋值操作和类型转换操作:

单目运算符操作与函数:

单目运算符或单目运算函数只有一个操作数: 比如取负(-2),绝对值操作等。

反射算术运算符

你相信我说我能用一位来表示反射运算吗?可能有人会认为表示一个反射运算是大的吓人的“外国概念”,反射实际上它是非常简单的。看下面的例子:

some_object + other

这是一个正常的加法。除了可以交换操作数以外,反射运算和加法是一样的:

other + some_object

除了执行那种 other对像作为第一个操作数,而它自身作为第二个操作数的运算以外,所有的魔法方法做的事情与正常运算表示的意义是等价的。在大部分情况下反射运算结果和它正常的运算是等价的,所以你可以不定义__radd__,而是调用__add__等等。注意,对像(本例中的other)在运算符左边的时候,必须保证该对像没有定义(或者返回NotImplemented的)它的非反射运算符。例如,在这个例子中,some_object.__radd__ 只有在 other没有定义__add__的时候才会被调用。

__radd__(self, other)

反射加法

__rsub__(self, other)

反射减法的

__rmul__(self, other)

反射除法

__rfloordiv__(self, other)

反射地板除,使用//运算符的

__rdiv__(self, other)

反射除法,使用/运算符的.

__rtruediv__(self, other)

反射真除.注意只有from __future__ import division 的时候它才有效

__rmod__(self, other)

反射取模运算,使用%运算符.

__rdivmod__(self, other)

长除法,使用divmod()内置函数,当divmod(other,self)时被调用.

__rpow__

反射乘方,使用**运算符的

__rlshift__(self, other)

反射左移,使用<<操作符.

__rrshift__(self, other)

反射右移,使用>>操作符.

__rand__(self, other)

反射位与,使用&操作符.

__ror__(self, other)

反射位或,使用|操作符.

__rxor__(self, other)

反射异或,使用^操作符.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/cb1b2f78dd9df2088d69413cabe7ac94.html