Chcę napisać niestandardową klasę, która zachowuje się dicttak, jak - więc dziedziczę z dict.
Moje pytanie brzmi jednak: czy muszę utworzyć członka prywatnego dictw mojej __init__()metodzie ?. Nie widzę w tym sensu, ponieważ mam już dictzachowanie, 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ę, myDictaby 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.