這是一個非常簡單的類來說明理論:
class Indexable(object):
def __getitem__(self, index):
print("You indexed me with {}.".format(index))
在使用中,則:
>>> i = Indexable()
>>> i[12]
You indexed me with 12.
在這裏我們可以清楚地看到,i[12]
解析爲Indexable.__getitem__(i, 12)
。
這種情況隨處可見 - 即使你打電話self[avariable]
實例方法中(包括__getitem__
),你最終會調用Indexable.__getitem__(self, avariable)
。這解釋了無限循環,如果您在Indexable.__getitem__
內包含self[avariable]
。
這將永遠是Python的情況下,你不能重新定義這種語法,而無需自己重寫。這是一種「神奇的方法」,就像str(instance)
調用Class.__str__(instance)
。
在實踐中,你一般會要定義索引一些有益的行爲,也許你想假numpy
風格逗號分隔的索引:
class NotArray(object):
def __init__(self, data):
self.data = data
def __getitem__(self, index):
data = self.data
for ind in index:
data = data[ind]
return data
這可以用於像:
>>> arr = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
>>> arr[1, 1, 1]
Traceback (most recent call last):
File "<pyshell#51>", line 1, in <module>
arr[1, 1, 1]
TypeError: list indices must be integers, not tuple
>>> arr = NotArray([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
>>> arr[1, 1, 1]
8
請注意,我們現在已經爲給定索引返回的數據定義了一個源。
您也可以使用它來實現非標準的語法,就像我在回答這個問題做:is it possible to add some new syntax in javascript?但這一般不提倡,因爲它會混淆你的代碼的讀者。
數據來自哪裏? – ThinkChaos 2014-11-14 17:24:25
@jonrsharpe其實我發佈這個問題找到使用像自我[avariable]的確切工作..如果它的posible請張貼它作爲答案 – lovemysql 2014-11-14 17:34:18