python_魔法方法(二):算術運算
阿新 • • 發佈:2018-11-04
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_魔法方法(二):算術運算