驄馬做了解釋什麼`的GetItem'用於一個良好的工作 - 但我想給你一個可能有用的例子。 想象一下建築物的建模。用於建築,它包括一些屬性,其中包括佔據每層公司的描述,數據中:
不使用__getitem__
,我們將有一個這樣的類:
class Building(object):
def __init__(self, floors):
self._floors = [None]*floors
def occupy(self, floor_number, data):
self._floors[floor_number] = data
def get_floor_data(self, floor_number):
return self._floors[floor_number]
building1 = Building(4) # Construct a building with 4 floors
building1.occupy(0, 'Reception')
building1.occupy(1, 'ABC Corp')
building1.occupy(2, 'DEF Inc')
print(building1.get_floor_data(2))
我們可以使用,無論__getitem__
(和它的對應__setitem__
)使建築類的使用更好。
class Building(object):
def __init__(self, floors):
self._floors = [None]*floors
def __setitem__(self, floor_number, data):
self._floors[floor_number] = data
def __getitem__(self, floor_number):
return self._floors[floor_number]
building1 = Building(4) # Construct a building with 4 floors
building1[0] = 'Reception'
building1[1] = 'ABC Corp'
building1[2] = 'DEF Inc'
print(building1[2])
無論您使用__setitem__
喜歡這真的取決於你打算如何抽象的數據 - 在這種情況下,我們決定把建築物作爲地板的容器(你也可以實現對建築物的迭代器,甚至可能分片 - 即一次獲取多個樓層的數據 - 這取決於你需要什麼。
這可能是一個例子使用的興趣:[如何正確地繼承dict並覆蓋__getitem__&__setitem__ ](http://stackoverflow.com/questions/2390827/how-to-properly-subclass-dict-and-override-getitem-setitem) – roganjosh
在你的例子中使用'__getitem__'沒有多大意義,但想象你需要t o編寫一個自定義列表或字典類的類,它必須與使用'[]'的現有代碼一起工作。這是'__getitem__'有用的情況。 –