零基礎入門學習Python(22):魔法方法(2)算術運算
利用type()函數可以知道某個對象是什麼類型:
>>> type(int) #int是類類型
<class 'type'>
>>> a = 2 #定義一個整數a,即a是類類型int的一個對象
>>> type(a)
<class 'int'>
>>> b = 1
>>> a + b #事實上,Python在將兩個對象相加
3
Python中,加、減、乘、除、取模、求平方等都有自己的魔法方法,需要時我們也可以重寫這些魔法方法。下面舉例說明一下,爲了區分重寫的魔法方法和原來的魔法方法,我們把加法定義爲減法,減法定義爲加法。
>>> class TestInt(int): #繼承int類
def __add__(self,other): #重寫加法魔法方法,返回值調用了int的減法魔法方法
return int.__sub__(self,other)
def __sub__(self,other): #重寫減法魔法方法,返回值調用了int的加法魔法方法
return int.__add__(self,other)
>>> a = TestInt(2) #生成一個TestInt類的對象並初始化爲2
>>> b = TestInt(1)
>>> a + b #先找a的加法方法__add__(),如未找到,則找b的反加法方法__radd__()
1 #結果爲1,說明運行a的加法方法時調用了int的減法方法
計算 a + b 時,當 a 的加法操作(add)不能實現或者不支持的時候,Pytnon就會找到 b 的反加法操作(radd)。
>>> class TestRint(int):
def __radd__(self,other): #重寫反加法魔法方法,返回值調用了int的加法魔法方法
return int.__sub__(self,other)
>>> c = TestRint(5)
>>> d = TestRint(6)
>>> c + d #c和d都是TestRint類的對象,繼承了int類,即可以找到它們各自的加法方法,因爲沒有重寫,所以使用的是int類中的加法魔法方法
11
>>> c + 1 #可以找到對象c的加法方法
6
>>> 1 + c #找不到1的加法方法,就會調用對象c的反加法方法,即重寫之後的方法,方法中self指c,other指1,所以得到(5-1)的結果
4
在進行算術運算時,一定要注意操作數的運算順序,其它算術運算的魔法方法跟加法類似,下面簡單舉例說明:
>>> a = int(2)
>>> b = int(3)
>>> a.__sub__(b)
-1
>>> a.__mul__(b)
6
>>> a.__floordiv__(b) #除法,向下取整
0
>>> a.__mod__(b) #取模
2
>>> a.__divmod__(b) #返回一個元組:(a//b, a%b)即商和餘數
(0, 2)
>>> a.__pow__(b) #求平方
8