课时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课后习题及答案
*******************************

 

posted @ 2018-08-24 18:37  那是个好男孩  阅读(546)  评论(0编辑  收藏  举报