python中比较操作和数值操作的魔法方法
比较操作符
Python包含了一系列的魔法方法,用于实现对象之间直接比较,可以重载Python默认的比较方法,改变它们的行为:
__cmp__(self,other)是所有比较魔法方法中最基础的一个,它实际上定义了所有比较操作符的行为(<,==,!=,等等),__cmp__()方法应该在self < other时返回一个负整数,在self == other时返回0,在 self > other时返回正整数。
__eq__(self, other)等于操作符(==)的行为。
__ne__(self, other)不等于操作符(!=)的行为。
__gt__(self, other)大于操作符(>)的行为。
__ge__(self, other)大于等于操作符(>=)的行为。
__lt__(self, other)小于操作符(<)的行为。
__le__(self, other)小于等于操作符(<=)的行为。
字符串的默认比较行为就是按照字字母顺序来比较单词。我们改变一下比较规则,按照字符串长度来比较:
class Word(str): def __gt__(self, other): return len(self) > len(other) def __lt__(self, other): return len(self) < len(other) a=Word(‘00123‘) b=Word(‘1234‘) print(a>b) True
我们没有定义 __eq__,所以会仍然使用使用str的默认规则来比较相等。
数值操作符
数值操作符分成了五类:一元操作符,常见算数操作符,反射算数操作符,增强赋值操作符,和类型转换操作符。
1、一元操作符:
__pos__(self):取正操作,+some_object。
__neg__(self):取负操作, -some_object。
__abs__(self):取绝对值函数abs()默认调用该方法。
__invert__(self):实现取反操作符 ~。
__round__(self,n):实现内建函数round(),n表示小数点的位数。
__floor__(self):实现math.floor()函数,即向下取整。
__ceil__(self):实现 math.ceil() 函数,即向上取整。
__trunc__(self):实现 math.trunc() 函数,即截取整数部分。
2、二元操作符
__add__(self, other):实现加法操作
__sub__(self, other):实现减法操作
__mul__(self, other):实现乘法操作
__floordiv__(self, other):实现使用 // 操作符的整数除法
__div__(self, other):实现使用 / 操作符的除法
truediv__(self, other):实现 true 除法,这个函数只有使用 from __future import division 时才有作用。
__mod__(self, other):实现 % 取余操作
__divmod__(self, other):实现divmod内建函数
__pow__(self, other):实现 ** 操作符。
__lshift__(self, other):实现左移位运算符 <<
__rshift__(self, other):实现右移位运算符 >>
__and__(self, other):实现按位与运算符 &
__or__(self, other):实现按位或运算符 |
__xor__(self, other):实现按位异或运算符 ^
3、反射算数运算符
反射算数运算符其实就是把操作符两边的对象互换了位置,如some_object + other反射之后是other + some_object
只有当other没有定义(或者产生NotImplemented异常)操作符的非反射(正常)版本,系统才会自动调用反射运算符。例如,在上面的例子中,只有当other 没有定义__add__ 时some_object.__radd__ 才会被调用。
反射算数运算符就是在正常的二元运算符名称前加一个小写的r,如反射加法操作是__radd__(self, other),反射乘法操作是__rmul__(self, other)
4、增强赋值运算符
__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__(self, other):**= 操作。
__ilshift__(self, other):实现<<=左移位赋值
__irshift__(self, other):实现>>=右移位赋值
__iand__(self, other):实现&=按位与赋值
__ior__(self, other):实现运算符 |= 按位或赋值
__ixor__(self, other):实现 ^= 按位异或赋值
5、类型转换操作符
__int__(self):int类型转换。
__float__(self):float类型转换。
__complex__(self):complex类型转换。
__oct__(self):八进制数类型转换。
__hex__(self):十六进制数类型转换。
__index__(self):实现当对象用于切片表达式时到一个整数的类型转换。如果你定义了一个可能会用于切片操作的数值类型,你应该定义 __index__。
coerce__(self):该方法用于实现混合模式算数运算,如果不能进行类型转换, __coerce 应该返回 None 。反之,它应该返回一个二元组 self 和 other ,这两者均已被转换成相同的类型。