2009-12-24 1 views

risposta

164

È necessario utilizzare __getitem__ method.

>>> class MyClass: 
...  def __getitem__(self, key): 
...   return key * 2 
... 
>>> myobj = MyClass() 
>>> myobj[3] 
6 

E se si sta andando ad essere l'impostazione dei valori di cui ha bisogno per attuare il __setitem__ method troppo, altrimenti questo accadrà:

>>> myobj[5] = 1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: MyClass instance has no attribute '__setitem__' 
34

Per sovraccaricarlo è necessario anche implementare i metodi __setitem__ e __delitem__.

modificare

quasi dimenticavo ... se si desidera emulare completamente un elenco, è inoltre necessario __getslice__, __setslice__ and __delslice__.

ci sono tutti documentati in http://docs.python.org/reference/datamodel.html

+36

'__getslice__,' '__setslice__' e __delslice__' sono stati deprecati per gli ultimi rilasci di ver 2.x (non so esattamente quando), e non sono più supportati in ver 3.x. Invece, usa '__getitem__'. '__setitem__' e' __delitem__ 'e verifica se l'argomento è di tipo 'slice', cioè:' if isinstance (arg, slice): ... –