python中的特殊方法 __getitem__()

特殊方法----getitem()

Python的特殊方法__getitem_() 主要作用是可以讓對象實現迭代功能。我們通過一個實例來說明。

定義一個Sentence類,通過索引提取單詞。

import re
RE_WORD = re.compile(r'\w+')
class Sentence:
    def __init__(self, text):
        self.text = text
        self.words = RE_WORD.findall(text)  # re.findall函數返回一個字符串列表,裏面的元素是正則表達式的全部非重疊匹配
    def __getitem__(self, index):
        return self.words[index]  
  • 測試
>>> s = Sentence('The time has come')
>>> for word in s:
            print(word)
    
    The
    time
    has
    come
>>> s[0]
    'The'
>>> s[1]
    'time'

通過測試發現,示例 s 可以正常迭代。但是沒有定義 getitem() 測試則會報錯, TypeError: '***' object is not iterable

序列可以迭代

我們都知道序列是可以迭代,下面具體說明原因。

解釋器需要迭代對象x時, 會自動調用iter(x)方法。內置的 iter(x) 方法有以下作用

  1. 檢查對象是否實現了__inter__ 方法,如果實現了就調用它(也就是我們偶爾用到的特殊方法重載),獲取一個迭代器。
  2. 如果沒有實現iter()方法, 但是實現了 __getitem__方法,Python會創建一個迭代器,嘗試按順序(從索引0開始,可以看到我們剛纔是通過s[0]取值)獲取元素。
  3. 如果嘗試失敗,Python拋出TypeError異常,通常會提示TypeError: '***' object is not iterable

任何Python序列都可迭代的原因是,他們都實現了__getitem__方法。其實,標準的序列也都實現了 __iter__方法。

注意: 從python3.4 開始,檢查對象x能否迭代,最準確的方法是: 調用iter(x)方法,如果不可迭代,在處理TypeError異常。這比使用isinstance(x,abc.Iterable)更準確,因爲iter()方法會考慮到遺留的__getitem__()方法,而abc.Iterable類則不考慮。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章