Python:魔術(shù)方法(__getitem__、__len__等包含雙下劃線構(gòu)成的方法)的簡介、使用案例之詳細(xì)攻略
魔術(shù)方法Magic Method的簡介
? ? ? ?Magic Method,即魔術(shù)方法,顧名思義,這些方法很強(qiáng)大,充滿魔力,可以讓你實現(xiàn)很多功能。魔術(shù)方法是python內(nèi)置方法,不需要主動調(diào)用,存在的目的是為了給python的解釋器進(jìn)行調(diào)用,幾乎每個魔法方法都有一個對應(yīng)的內(nèi)置函數(shù),或者運算符,當(dāng)我們對這個對象使用這些函數(shù)或者運算符時就會調(diào)用類中的對應(yīng)魔法方法,可以理解為重寫這些python的內(nèi)置函數(shù)。
(1)、舉例理解Magic Method
? ? ? ?在Python中,像__getitem__這種由兩個雙下劃線構(gòu)成的方法,統(tǒng)一被稱為魔術(shù)方法。魔術(shù)方法是為了給python解釋器用的。魔術(shù)方法是屬于類的方法,都是針對類來進(jìn)行操作。也就是說不需要實例化類就可以訪問到該方法,同時,實例化的對象都可以訪問到該方法。
比如當(dāng)使用len(function)時,實際上調(diào)用的就是object.__len__方法。而在使用function['key']的形式來訪問元素時,實際上調(diào)用的是object.__getitem__(key)方法。
使用__getitem__和__len__方法,我們就可以實現(xiàn)一個對自定義數(shù)據(jù)類型的迭代和訪問。
常用的魔術(shù)方法使用案例
1、常用方法
(1)、__init__:初始化方法
構(gòu)造器,當(dāng)一個實例被創(chuàng)建的時候調(diào)用的初始化方法
class Test_init:
def __init__(self):
print("魔術(shù)方法之__init__方法")
print(Test_init())
(2)、__len__():返回容器中元素的個數(shù)
要想針對類的對象實例使len()函數(shù)成功執(zhí)行,必須要在類中定義__len__()。如果沒有定義__len__(),那么輸入len(c1)會提示出錯,顯然錯誤原因是因為Class01類中并沒有l(wèi)en()的定義。因為len()必須接收一個具體的實例化對象的屬性,如果改成len(c1.values)也能成功執(zhí)行!
# __ len__():返回元素的數(shù)量
class Test_len(object):
def __init__(self, *args):
self.names = args
def __len__(self):
print("魔術(shù)方法之__len__方法")
return len(self.names)
res02 = Test_len('Bob', 'Alice', 'Tom')
print(len(res02))
2、比較操作符
(1)、__lt__(self, other):定義小于號的行為
x < y 調(diào)用 x__lt__(y)
3、算數(shù)運算符
(1)、__add__(self, other):定義加法的行為:+
4、增量賦值運算
(1)、__iadd__(self, other): 定義賦值加法的行為:+=
5、一元操作符
(1)、__pos__(self):定義正號的行為:+x
6、容器類型
(1)、_getitem__():返回鍵對應(yīng)的值
如果在類中定義了這個__getitem__ 方法,那么它的實例對象(假定為p),可以像這樣p[key] 取值。當(dāng)實例對象做p[key] 運算時,會調(diào)用類中的方法__getitem__。__getitem __可以讓對象實現(xiàn)迭代功能,這樣可以不斷的調(diào)用數(shù)據(jù)。
class Test_getitem:
def __init__(self,id):
self.id=id
# ,它的實例對象P,可以以P[key]形式取值
def __getitem__(self, item): # 當(dāng)實例對象做P[key]運算時,就會調(diào)用類中的__getitem__()方法
print("魔術(shù)方法之__getitem__方法")
return self.id
res = Test_getitem('This is id')
print(res.id)
print(res[0]) # 當(dāng)實例對象做P[key]運算時,就會調(diào)用類中的__getitem__()方法
print(res['0000'])