目录:
一、反运算
二、增量赋值运算
三、一元操作符
四、课时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课后习题及答案 *******************************