1. 程式人生 > >python_魔法方法(二):算術運算

python_魔法方法(二):算術運算

strong 操作符 數值 rac previous += sub 註意 rsh

python2.2之後,對類和類型做了同意,將int()、float()、str()、list()、touple()這些BIF轉換為工廠函數

>>> type(len)
<class builtin_function_or_method>
>>> type(int)
<class type>
>>> type(dir)
<class builtin_function_or_method>
>>> type(list)
<class type>

在來看一個例子

>>> class C():
    pass

>>> type(C)
<class type>

它的類型是type類型,也是類對象,其實所謂的工廠函數,就是一個類對象,當你調用他們的時候,實際上就是創建一個實例對象:

>>> type(C)
<class type>
>>> a = int(123)
>>> b = int(456)
>>> a + b
579

由此可以看出,對象是可以計算的。python中無處不對象,當在求a+b等於多少的時候,事實上python就是將兩個對象進行相加操作。python的魔法方法還體統了自定義對象的數值處理,通過對下面這些魔法方法的重寫,可以自定義任何對象間的算術運算。

1、運算和反運算

         運算                                                      反運算
__add__(self,other):定義加法行為                               __radd__(self,other)
__sub__(self,other):減法行為                                  __rsub__(self,other)
__mul__(self,other):乘法行為                                  __rmul__
(self,other) __truediv__(self,other):除法行為 __rtruediv__(self,other) __floordiv__(self,other):整除// __rfloordiv__(self,other) __mod__(self,other):取模行為% __rmod__(self,other) __divmod__(self,other):定義當被divmod()調用時行為 __rdivmod__(self,other) __pow__(self,other):乘方** __rpow__(self,other) __rshift__(self,other)和__lshift__(self,other):左移位<<和右移位>> __rrshift__(self,other)和__rlshift__(self,other) __and__(self,other):按位與& __rand__(self,other) __xor__(self,other):按位或^ __rxor__(self,other) __or__(self,other):按位或操作的行為 __ror__(self,other)

舉個例子

>>> class  New_int(int):
    def __add__(self,other):
        return int.__sub__(self,other)
    def __sub__(self,other):
        return int.__add__(self,other)

    
>>> a = New_int(3)
>>> b = New_int(5)
>>> a
3
>>> b
5
>>> a + b
-2
>>> a - b
8

這裏用了python默認的方法,如果自己定義了,嘗試一下就會發現錯誤

>>> class  Try_int(int):
    def __add__(self,other): 
        return self + other  #出現了無限遞歸,主要原因在於:對象涉及加法操作,自動調用了魔法方法__add__(),返回return self+other也就是對象本身加另一個對象,形成了無限遞歸
    def __sub__(self,other):
        return self - other
    
>>> a = Try_int(1)
>>> b = Try_int(2)
>>> a + b
Traceback (most recent call last):
  File "<pyshell#44>", line 1, in <module>
    a + b
  File "<pyshell#41>", line 3, in __add__
    return self + other
  File "<pyshell#41>", line 3, in __add__
    return self + other
  File "<pyshell#41>", line 3, in __add__
    return self + other
  [Previous line repeated 327 more times]
RecursionError: maximum recursion depth exceeded while calling a Python object

上面例子可以修改下,就不會出現無限遞歸了

>>> class  Try_int(int):
    def __add__(self,other):
        return int(self) + int(other)
    def __sub__(self,other):
        return int(self) - int(other)
    
>>> a = Try_int(1)
>>> b = Try_int(2)
>>> a + b
3

關於反運算我這裏舉一個例子,

1 class Nint(int):
2     def __radd__(self, other):
3         return int.__sub__(self,other)
4 
5 c = Nint(5)
6 d = Nint(3)
7 print(a+b)  #-2

所以在重寫反運算魔法方法的時候,一定要註意順序問題。

2、增量賦值運算

python也有大量的魔法方法可以定制增量賦值語句,增量賦值其實就是一種能偷懶的形式,它將操作符與賦值的形式結合起來,例如

>>> a = a + b #一般形式
>>> a += b  #協成增量賦值的形式

3、一元操作符

一元操作符就是只有一個操作數的意思,像a+b這樣,加號左右有a.b兩個操作數,叫做二元操作符。只有一個操作數的,例如把劍豪放在一個操作數的前邊,就是取這個操作數的相反數的意思,這個時候管它叫負號。

python支持的一元操作符主要有__neg__()(表示正號),__pos__()(定義負號),__abs__()(定義當被__abs__()調用時取絕對值的意思),__nver__()(定義按位取反)

python_魔法方法(二):算術運算