詳解Python魔術方法__getitem__、__setitem__、__delitem__、__len__

pythontab發表於2016-12-07

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__()攔截,從而進行我們在方法中設定的操作,如賦值,修改內容,刪除內容等等。

相關文章