赞
踩
上一篇文章上一篇文中,我们一起了解了运算相关的魔法方法,那今天我们就来看看什么是反运算相关的魔法。
在了解反运算相关魔法之前,大家来看看以下表:
不难发现,这里的反运算相关魔法方法与上一节介绍的复术运算相关的魔法方法 保持一一对应的关系,不同之处就是反运算的魔法方法多了一个“r”,例如,__add__()就对应__radd__().
例如a+b,这里加数是a,被加数是b,请问大家:这里是a主动还是b主动?
肯定是a主动,对不对?这就好比“我请你吃饭”这句话,“我”肯定是主动的,所以吃完饭理应由“我”来买单。如果那天我刚好没带钱,但饭钱是一定要给的,那应该由谁来给?肯定就只能由b来给了。
反运算是同样一个道理,如果a对象的__add__()方法没有实现或者不支持相应的操作,那么Python就会自动调用b的__radd__()方法。
举个例子:
>>> class nint(int):
def _radd_(self,other):
return int.sub__(other, self)
>>> a - Nint (5)
>>> b = Nint (3)
>>> a + b
8
由于a对象默认有__add __()方法,所以b的__radd __()没有执行,这样就有了:
关于反运算,这里还要注意一点:对于a+b来说,b的__radd__(self,other)中的self是b对象,other是a对象。
所以不能这么写:
>>> class Nint (int):
def__rsub__(self, other):
return int.__sub__(self, other)
>>> a = Nint (5)
>>> 3 - a
2
因此,对于注重操作数顺序的运算符(如减法、除法、移位),在重写反运算魔法方法的时候,就一定要注意顺序问题了。
一元操作符
Python 支持的一元操作符:__neg__()表示行为:__pos__()表示定义负号行为:而__abs__()表示定义abs()函数(取绝对值)被调用时的行为;__invert__()表示定义按位取反的行为。
欢迎留言点赞关注
我们一起分享AI学习与发展的干货
如转载,请后台留言,遵守转载规范
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。