所有反射运算符魔法方法和它们的常见版本做的工作相同,只不过是处理交换连个操作数之后的情况。绝大多数情况下,反射运算和正常顺序产生的结果是相同的,所以很可能你定义 __radd__ 时只是调用一下 __add__。注意一点,操作符左侧的对象(也就是上面的 other )一定不要定义(或者产生 NotImplemented 异常) 操作符的非反射版本。例如,在上面的例子中,只有当 other 没有定义 __add__ 时 some_object.__radd__ 才会被调用。
__radd__(self, other)
实现反射加法操作。
__rsub__(self, other)
实现反射减法操作。
__rmul__(self, other)
实现反射乘法操作。
__rfloordiv__(self, other)
实现使用 // 操作符的整数反射除法。
__rdiv__(self, other)
实现使用 / 操作符的反射除法。
__rtruediv__(self, other)
实现 _true_ 反射除法,这个函数只有使用 from __future__ import division 时才有作用。
__rmod__(self, other)
实现 % 反射取余操作符。
__rdivmod__(self, other)
实现调用 divmod(other, self) 时 divmod 内建函数的操作。
__rpow__
实现 ** 反射操作符。
__rlshift__(self, other)
实现反射左移位运算符 << 的作用。
__rshift__(self, other)
实现反射右移位运算符 >> 的作用。
__rand__(self, other)
实现反射按位与运算符 & 。
__ror__(self, other)
实现反射按位或运算符 | 。
__rxor__(self, other)
实现反射按位异或运算符 ^ 。
3.2.4. 增强赋值运算符
Python同样提供了大量的魔法方法,可以用来自定义增强赋值操作的行为。或许你已经了解增强赋值,它融合了“常见”的操作符和赋值操作,如果你还是没听明白,看下面的例子:
x = 5 x += 1 # 也就是 x = x + 1这些方法都应该返回左侧操作数应该被赋予的值(例如, a += b __iadd__ 也许会返回 a + b ,这个结果会被赋给 a ),下面是方法列表:
__iadd__(self, other)
实现加法赋值操作。
__isub__(self, other)
实现减法赋值操作。
__imul__(self, other)
实现乘法赋值操作。
__ifloordiv__(self, other)
实现使用 //= 操作符的整数除法赋值操作。
__idiv__(self, other)
实现使用 /= 操作符的除法赋值操作。
__itruediv__(self, other)
实现 _true_ 除法赋值操作,这个函数只有使用 from __future__ import division 时才有作用。
__imod__(self, other)
实现 %= 取余赋值操作。
__ipow__
实现 **= 操作。
__ilshift__(self, other)
实现左移位赋值运算符 <<= 。
__irshift__(self, other)
实现右移位赋值运算符 >>= 。
__iand__(self, other)
实现按位与运算符 &= 。
__ior__(self, other)
实现按位或赋值运算符 | 。
__ixor__(self, other)
实现按位异或赋值运算符 ^= 。
3.2.5. 类型转换操作符
Python也有一系列的魔法方法用于实现类似 float() 的内建类型转换函数的操作。它们是这些:
__int__(self)
实现到int的类型转换。
__long__(self)
实现到long的类型转换。
__float__(self)
实现到float的类型转换。
__complex__(self)
实现到complex的类型转换。
__oct__(self)
实现到八进制数的类型转换。
__hex__(self)
实现到十六进制数的类型转换。
__index__(self)
实现当对象用于切片表达式时到一个整数的类型转换。如果你定义了一个可能会用于切片操作的数值类型,你应该定义 __index__。
__trunc__(self)
当调用 math.trunc(self) 时调用该方法, __trunc__ 应该返回 self 截取到一个整数类型(通常是long类型)的值。
__coerce__(self)