- 3.3.8. 模拟数字类型
3.3.8. 模拟数字类型
定义以下方法即可模拟数字类型。特定种类的数字不支持的运算(例如非整数不能进行位运算)所对应的方法应当保持未定义状态。
object.add(self, other)object.sub(self, other)object.mul(self, other)object.matmul(self, other)object.truediv(self, other)object.floordiv(self, other)object.mod(self, other)object.divmod(self, other)object.pow(self, other[, modulo])object.lshift(self, other)object.rshift(self, other)object.and(self, other)object.xor(self, other)object.or(self, other)- 调用这些方法来实现二进制算术运算 (
+,-,,@,/,//,%,divmod(),pow(),*,<<,>>,&,^,|)。例如,求表达式x + y的值,其中 x 是具有add()方法的类的一个实例,则会调用x.add(y)。divmod()方法应该等价于使用floordiv()和mod(),它不应该被关联到truediv()。请注意如果要支持三元版本的内置pow()函数,则pow()的定义应该接受可选的第三个参数。
如果这些方法中的某一个不支持与所提供参数进行运算,它应该返回 NotImplemented。
object.radd(self, other)object.rsub(self, other)object.rmul(self, other)object.rmatmul(self, other)object.rtruediv(self, other)object.rfloordiv(self, other)object.rmod(self, other)object.rdivmod(self, other)object.rpow(self, other)object.rlshift(self, other)object.rrshift(self, other)object.rand(self, other)object.rxor(self, other)object.ror(self, other)- 调用这些方法来实现具有反射(交换)操作数的二进制算术运算 (
+,-,,@,/,//,%,divmod(),pow(),*,<<,>>,&,^,|)。这些成员函数仅会在左操作数不支持相应运算 3 且两个操作数类型不同时被调用。4 例如,求表达式x - y的值,其中 y 是具有rsub()方法的类的一个实例,则当x.sub(y)返回 NotImplemented 时会调用y.rsub(x)。
请注意三元版的 pow() 并不会尝试调用 rpow() (因为强制转换规则会太过复杂)。
注解
如果右操作数类型为左操作数类型的一个子类,且该子类提供了指定运算的反射方法,则此方法会先于左操作数的非反射方法被调用。此行为可允许子类重载其祖先类的运算符。
object.iadd(self, other)object.isub(self, other)object.imul(self, other)object.imatmul(self, other)object.itruediv(self, other)object.ifloordiv(self, other)object.imod(self, other)object.ipow(self, other[, modulo])object.ilshift(self, other)object.irshift(self, other)object.iand(self, other)object.ixor(self, other)object.ior(self, other)- 调用这些方法来实现扩展算术赋值 (
+=,-=,=,@=,/=,//=,%=,*=,<<=,>>=,&=,^=,|=)。这些方法应该尝试进行自身操作 (修改 self) 并返回结果 (结果应该但并非必须为 self)。如果某个方法未被定义,相应的扩展算术赋值将回退到普通方法。例如,如果 x 是具有iadd()方法的类的一个实例,则x += y就等价于x = x.iadd(y)。否则就如x + y的求值一样选择x.add(y)和y.radd(x)。在某些情况下,扩展赋值可导致未预期的错误 (参见 为什么 a_tuple[i] += ['item'] 会在执行加法时引发异常?),但此行为实际上是数据模型的一个组成部分。
object.neg(self)object.pos(self)object.abs(self)object.invert(self)- 调用此方法以实现一元算术运算 (
-,+,abs()和~)。
object.complex(self)object.int(self)object.float(self)- 调用这些方法以实现内置函数
complex(),int()和float()。应当返回一个相应类型的值。
object.index(self)- 调用此方法以实现
operator.index()以及 Python 需要无损地将数字对象转换为整数对象的场合(例如切片或是内置的bin(),hex()和oct()函数)。 存在此方法表明数字对象属于整数类型。 必须返回一个整数。
注解
为了具有一致的整数类型类,当定义了 index() 的时候也应当定义 int(),两者应当返回相同的值。
object.round(self[, ndigits])object.trunc(self)object.floor(self)object.ceil(self)- 调用这些方法以实现内置函数
round()以及math函数trunc(),floor()和ceil()。 除了将 ndigits 传给round()的情况之外这些方法的返回值都应当是原对象截断为Integral(通常为int)。
如果未定义 int() 则内置函数 int() 会回退到 trunc()。
