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