Python的魔術方法一般以__methodname__的形式命名,如:__init__(構造方法), __getitem__、 __setitem__(subscriptable所需method), __delitem__(del obj[key]所需method), __len__(len(…)所需method)等。
在Python中,如果我們想實現建立類似於序列和對映的類,可以透過重寫魔法方法__getitem__、__setitem__、__delitem__、__len__方法去模擬。
魔術方法的作用:
__getitem__(self,key):返回鍵對應的值。
__setitem__(self,key,value):設定給定鍵的值
__delitem__(self,key):刪除給定鍵對應的元素。
__len__():返回元素的數量
程式碼例項:
# coding:utf-8 ''' desc:嘗試定義一種新的資料型別 等差數列 author:pythontab.com ''' class ArithemeticSequence(object): def __init__(self,start=0,step=1): print 'Call function __init__' self.start=start self.step=step self.myData={} # 定義獲取值的方法 def __getitem__(self,key): print 'Call function __getitem__' try: return self.myData[key] except KeyError: return self.start+key*self.step # 定義賦值方法 def __setitem__(self,key,value): print 'Call function __setitem__' self.myData[key]=value # 定義獲取長度的方法 def __len__(self): print 'Call function __len__' # 這裡為了可以看出__len__的作用, 我們故意把length增加1 return len(self.myData) + 1 # 定義刪除元素的方法 def __delitem__(self, key): print 'Call function __delitem__' del self.myData[key] s=ArithemeticSequence(1,2) print s[3] # 這裡應該執行self.start+key*self.step,因為沒有3這個key s[3] = 100 # 進行賦值 print s[3] # 前面進行了賦值,那麼直接輸出賦的值100 print len(s) # 我們故意多加了1,應該返回2 del s[3] # 刪除3這個key print s[3] # 這裡應該執行self.start+key*self.step,因為3這個key被刪了
輸出結果:
Call function __init__ Call function __getitem__ 7 Call function __setitem__ Call function __getitem__ 100 Call function __len__ 2 Call function __delitem__ Call function __getitem__ 7
這些魔術方法的原理就是:當我們對類的屬性item進行下標的操作時,首先會被__getitem__()、__setitem__()、__delitem__()攔截,從而進行我們在方法中設定的操作,如賦值,修改內容,刪除內容等等。