Przejrzałem większość dokumentacji __getitem__
w dokumentacji Pythona, ale nadal nie jestem w stanie pojąć jej znaczenia.
Wszystko, co mogę zrozumieć, to to, że __getitem__
jest używany do wykonywania wywołań takich jak self[key]
. Ale jaki z tego pożytek?
Powiedzmy, że mam klasę Pythona zdefiniowaną w ten sposób:
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def __getitem__(self,key):
print ("Inside `__getitem__` method!")
return getattr(self,key)
p = Person("Subhayan",32)
print (p["age"])
To zwraca wyniki zgodnie z oczekiwaniami. Ale po co używać __getitem__
w pierwszej kolejności? Słyszałem również, że Python wywołuje __getitem__
wewnętrznie. Ale dlaczego to robi?
Czy ktoś mógłby wyjaśnić to bardziej szczegółowo?
__getitem__
Wykorzystania w przykładzie nie ma wiele sensu, ale wyobrażam sobie, że trzeba napisać niestandardowy listy- słownika lub podobnego do klasy, która ma współpracować z istniejącym kodem, który używa[]
. Taka sytuacja__getitem__
jest przydatna.Odpowiedzi:
Cong Ma dobrze sobie radzi, wyjaśniając, do czego
__getitem__
służy - ale chcę podać przykład, który może być przydatny. Wyobraź sobie klasę, która modeluje budynek. W danych dla budynku zawiera szereg atrybutów, w tym opisy firm zajmujących poszczególne piętra:Bez użycia
__getitem__
mielibyśmy taką klasę:Moglibyśmy jednak użyć
__getitem__
(i jej odpowiednika__setitem__
), aby uczynić użycie klasy Building „przyjemniejszym”.To, czy użyjesz w
__setitem__
ten sposób, naprawdę zależy od tego, jak planujesz wyodrębnić swoje dane - w tym przypadku zdecydowaliśmy się traktować budynek jako kontener pięter (i możesz również zaimplementować iterator dla budynku, a może nawet możliwość cięcia - tzn. uzyskaj dane z więcej niż jednego piętra na raz - zależy to od Twoich potrzeb.źródło
building1[2]
to wywołanie, wewnętrznie wywołuje getitem. Tak więc celem @ tony-suffolk-66 jest to, że dowolną właściwość / zmienną klasy można pobrać w czasie wykonywania, po prostu wywołując nazwę obiektu [nazwa_zmiennej]. Po prostu wyjaśniam to, ponieważ początkowo nie było to dla mnie jasne i pisząc to tutaj, mając nadzieję, że to komuś pomoże. Usuń, jeśli niepotrzebne, proszęlen()
, a otrzymaszTypeError
:TypeError: object of type 'Building' has no len()
[]
Składnia coraz przedmiot przez klucz lub indeks jest tylko cukier składni.Podczas oceny
a[i]
wywołań Pythonaa.__getitem__(i)
(lubtype(a).__getitem__(a, i)
, ale to rozróżnienie dotyczy modeli dziedziczenia i nie jest tutaj ważne). Nawet jeśli klasa ofa
nie może jawnie definiować tej metody, zwykle jest ona dziedziczona z klasy nadrzędnej.Wszystkie specjalne nazwy metod (Python 2.7) i ich semantyka są wymienione tutaj: https://docs.python.org/2.7/reference/datamodel.html#special-method-names
źródło
Metoda magiczna
__getitem__
jest zasadniczo używana do uzyskiwania dostępu do elementów list, pozycji słownika, elementów tablic itp. Jest bardzo przydatna do szybkiego wyszukiwania atrybutów instancji.Tutaj pokazuję to z przykładową klasą Osoba, której instancje można utworzyć za pomocą „imienia”, „wieku” i „daty urodzenia”.
__getitem__
Metoda jest napisany w taki sposób, że można uzyskać dostęp do indeksowanych atrybutów przykład, takie jak imię lub nazwisko, dnia, miesiąca lub roku DOB itpZałóżmy, że jedno wejście użytkownika jest następujące:
Za pomocą
__getitem__
metody użytkownik może uzyskać dostęp do indeksowanych atrybutów. na przykład,źródło