课时43:魔法方法:算术运算2
目录:
一、反运算
二、增量赋值运算
三、一元操作符
四、课时43课后习题及答案
*************
一、反运算
*************
下表列举了反运算相关的魔法方法:
__radd__(self, other) 定义加法的行为:+ (当左操作数不支持相应的操作时被调用) __rsub__(self, other) 定义减法的行为:- (当左操作数不支持相应的操作时被调用) __rmul__(self, other) 定义乘法的行为:* (当左操作数不支持相应的操作时被调用) __rtruediv__(self, other) 定义真除法的行为:/ (当左操作数不支持相应的操作时被调用) __rfloordiv__(self, other) 定义整数除法的行为:// (当左操作数不支持相应的操作时被调用) __rmod__(self, other) 定义取模算法的行为:% (当左操作数不支持相应的操作时被调用) __rdivmod__(self, other) 定义当被 divmod() 调用时的行为 (当左操作数不支持相应的操作时被调用) __rpow__(self, other[, modulo]) 定义当被 power() 调用或 ** 运算时的行为 (当左操作数不支持相应的操作时被调用) __rlshift__(self, other) 定义按位左移位的行为:<< (当左操作数不支持相应的操作时被调用) __rrshift__(self, other) 定义按位右移位的行为:>> (当左操作数不支持相应的操作时被调用) __rand__(self, other) 定义按位与操作的行为:& (当左操作数不支持相应的操作时被调用) __rxor__(self, other) 定义按位异或操作的行为:^ (当左操作数不支持相应的操作时被调用) __ror__(self, other) 定义按位或操作的行为:| (当左操作数不支持相应的操作时被调用)
不难发现,这里的反运算魔法方法跟上节介绍的算术运算符保持一一对应,不同之处就是反运算魔法方法多了一个“r”,例如:__add__()就对应__radd__().举个例子。
>>> a + b >>> #这里加数是a,被加数是b,请问大家:这里是a主动,还是b主动? >>> #肯定是a主动,对不对? >>> #反运算是同样一个道理,如果a对象__add__()方法没法实现或者不支持相应的操作,那么Python就会自动调用b的__add__()方法
试一下:
>>> 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__()没有执行 >>> #这样就有了 >>> 1 + b -2
关于反运算,这里还要注意一点:对于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也有大量的魔术方法可以定制增量赋值语句,增量赋值其实就是一种偷懒的行为,它将操作符和赋值结合起来。例如:
>>> a = a + b >>> #写成增量赋值的形式就是: >>> a += b
__iadd__(self, other) 定义赋值加法的行为:+= __isub__(self, other) 定义赋值减法的行为:-= __imul__(self, other) 定义赋值乘法的行为:*= __itruediv__(self, other) 定义赋值真除法的行为:/= __ifloordiv__(self, other) 定义赋值整数除法的行为://= __imod__(self, other) 定义赋值取模算法的行为:%= __ipow__(self, other[, modulo]) 定义赋值幂运算的行为:**= __ilshift__(self, other) 定义赋值按位左移位的行为:<<= __irshift__(self, other) 定义赋值按位右移位的行为:>>= __iand__(self, other) 定义赋值按位与操作的行为:&= __ixor__(self, other) 定义赋值按位异或操作的行为:^= __ior__(self, other) 定义赋值按位或操作的行为:|=
******************
三、一元操作符
******************
一元操作符就是只有一个操作数的意思,像a + b这样,加号左右有a、b两个操作数,叫做二元操作符。只有一个操作数的,例如把减号放在一个操作数的前边,就是取这个操作数的相反数的意思,这时候管它叫负号。
Python支持的一元操作符主要有_ _neg_ _()(表示正号行为),_ _pos_ _()(表示负号行为),_ _abs_ _()(定义当被abs()调用时的行为,就是取绝对值的意思),还有一个_ _invert_ _()(定义按位取反的行为)
__pos__(self) 定义正号的行为:+x __neg__(self) 定义负号的行为:-x __abs__(self) 定义当被 abs() 调用时的行为 __invert__(self) 定义按位求反的行为:~x
*******************************
四、课时43课后习题及答案
*******************************