Jak zastąpić operatora [] w Pythonie?


Odpowiedzi:


290

Musisz użyć tej __getitem__metody .

class MyClass:
    def __getitem__(self, key):
        return key * 2

myobj = MyClass()
myobj[3] #Output: 6

A jeśli zamierzasz ustawiać wartości, musisz także zaimplementować tę __setitem__metodę , w przeciwnym razie tak się stanie:

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

63

Aby całkowicie go przeciążyć, musisz również wdrożyć metody __setitem__i __delitem__.

edytować

Prawie zapomniałem ... jeśli chcesz całkowicie naśladować listę, potrzebujesz również __getslice__, __setslice__ and __delslice__.

Wszystkie są udokumentowane w http://docs.python.org/reference/datamodel.html


67
__getslice__, __setslice__` i __delslice__' have been deprecated for the last few releases of ver 2.x (not sure exactly when), and are no longer supported in ver 3.x. Instead, use __getitem__ . __setitem__` i __delitem__' and test if the argument is of type plasterek , i.e.: jeśli isinstance (arg, slice): ...
Don O'Donnell

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.