就如同你可以通过定义比较操作来比较你自己的类实例一样,你也可以自己定义数学运算符号的行为。好吧,先系紧你的裤腰带,深呼吸......,这些操作可多着呢。由于文章组织需要,我把这些数学“魔术方法”分为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)
反射异或,使用^操作符.