1、__getitem__
原文文檔:For instance, if a class defines a method named__getitem__(), and x is an instance of this class, then x[i] is roughly equivalent tox.__getitem__(i) for old-style classes and type(x).__getitem__(x, i) for new-style classes. Except where mentioned, attempts to execute an operation raise an exception when no appropriate method is defined (typically AttributeError or TypeError).
Dive into python:
除了普通的類方法,Python 類還可以定義專用方法。專用方法是在特殊情況下或當使用特別文法時由 Python 替你調用的,而不是在代碼中直接調用 (像普通的方法那樣)。就像你在上一節所看到的,普通的方法對在類中封裝字典很有協助。但是只有普通方法是不夠的,因為除了對字典調用方法之外,還有很多事情可以做的。例如,你可以通過一種沒有包括明確方法調用的文法來獲得和設定資料項目。這就是專用方法產生的原因:它們提供了一種方法,可以將非方法調用文法映射到方法調用上。
例 5.12. __getitem__ 專用方法
def __getitem__(self, key): return self.data[key]
>>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3")>>> f{'name':'/music/_singles/kairo.mp3'}>>> f.__getitem__("name") '/music/_singles/kairo.mp3'>>> f["name"] '/music/_singles/kairo.mp3'
(1) __getitem__ 專用方法很簡單。像普通的方法 clear,keys 和 values 一樣,它只是重新導向到字典,返回字典的值。但是怎麼調用它呢?哦,你可以直接調用 __getitem__,但是在實際中你其實不會那樣做:我在這裡執行它只是要告訴你它是如何工作的。正確地使用 __getitem__ 的方法是讓 Python 來替你調用。
(2) 這個看上去就像你用來得到一個字典值的文法,事實上它返回你期望的值。下面是隱藏起來的一個環節:暗地裡Python 已經將這個文法轉化為 f.__getitem__("name") 的方法調用。這就是為什麼 __getitem__ 是一個專用類方法的原因,不僅僅是你可以自已調用它,還可以通過使用正確的文法讓 Python 來替你調用。
Example 5.13. The __setitem__ Special Method
def __setitem__(self, key, item): self.data[key] = item
>>> f
{'name':'/music/_singles/kairo.mp3'}
>>> f.__setitem__("genre", 31) (1)
>>> f
{'name':'/music/_singles/kairo.mp3', 'genre':31}
>>> f["genre"] = 32 (2)
>>> f
{'name':'/music/_singles/kairo.mp3', 'genre':32}
(1) 與 __getitem__ 方法一樣,__setitem__ 簡單地重新導向到真正的字典 self.data ,讓它來進行工作。並且像 __getitem__ 一樣,通常你不會直接調用它,當你
使用了正確的文法,Python 會替你調用 __setitem__ 。
(2) 這個看上去像正常的字典文法,當然除了 f 實際上是一個類,它儘可能地打扮成一個字典,並且 __setitem__ 是打扮的一個重點。這行代碼實際上暗
地裡調用了 f.__setitem__("genre", 32)。
用 __getitem__ 和 __setitem__ 可以實現 C# 索引器的功能。>>> class Class1: def __init__(self): self.__x = ["a", "b", "c"] def __getitem__(self, key): return self.__x[key] def __setitem__(self, key, value): self.__x[key] = value>>> a = Class1()>>> a[1]'b'>>> a[1] = "xxxx">>> a[1]'xxxx'
__delitem__ 在調用 del instance[key] 時調用 ,你可能記得它作為從字典中刪除單個元素的方法。當你在類執行個體中使用 del 時,Python 替你調用 __delitem__ 專用方法。
class A:
def __delitem__(self, key):
print 'delete item:%s' %key
a = A()
del a['key']