首页 > 其他学习 > python > python中比较操作和数值操作的魔法方法
2018
11-23

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 ,这两者均已被转换成相同的类型。

最后编辑:
作者:qingheluo
这个作者貌似有点懒,什么都没有留下。