课时43:魔法方法:算术运算2

发布时间:2019-03-03 10:38:16编辑:auto阅读(1901)

    目录:

      一、反运算

      二、增量赋值运算

      三、一元操作符

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

     

关键字