Chcę napisać niestandardową klasę, która zachowuje się dict
tak, jak - więc dziedziczę z dict
.
Moje pytanie brzmi jednak: czy muszę utworzyć członka prywatnego dict
w mojej __init__()
metodzie ?. Nie widzę w tym sensu, ponieważ mam już dict
zachowanie, jeśli po prostu odziedziczę po dict
.
Czy ktoś może wskazać, dlaczego większość fragmentów dziedziczenia wygląda tak, jak ten poniżej?
class CustomDictOne(dict):
def __init__(self):
self._mydict = {}
# other methods follow
Zamiast prostszego ...
class CustomDictTwo(dict):
def __init__(self):
# initialize my other stuff here ...
# other methods follow
Właściwie myślę, że podejrzewam, że odpowiedź na to pytanie jest taka, że użytkownicy nie mogą uzyskać bezpośredniego dostępu do Twojego słownika (tj. Muszą korzystać z podanych przez Ciebie metod dostępu).
A co z operatorem dostępu do tablicy []
? Jak można to zaimplementować? Jak dotąd nie widziałem przykładu pokazującego, jak przesłonić []
operator.
Więc jeśli []
w klasie niestandardowej nie ma funkcji dostępu, dziedziczone metody bazowe będą działać na innym słowniku?
Wypróbowałem następujący fragment kodu, aby sprawdzić, czy rozumiem dziedziczenie w Pythonie:
class myDict(dict):
def __init__(self):
self._dict = {}
def add(self, id, val):
self._dict[id] = val
md = myDict()
md.add('id', 123)
print md[id]
Otrzymałem następujący błąd:
KeyError: <ID funkcji wbudowanej>
Co jest nie tak z powyższym kodem?
Jak poprawić klasę, myDict
aby móc pisać taki kod?
md = myDict()
md['id'] = 123
[Edytować]
Zedytowałem powyższy przykładowy kod, aby pozbyć się głupiego błędu, który popełniłem, zanim odskoczyłem od biurka. To była literówka (powinienem to zauważyć w komunikacie o błędzie).
dict
, powinieneś użyć samego obiektu (używającsuper
) zamiast po prostu delegować do instancji__dict__
- co zasadniczo oznacza, że tworzysz dwie dykty dla każdej instancji.