Ich möchte eine benutzerdefinierte Klasse schreiben, die sich wie dictfolgt verhält - also erbe ich von dict.
Meine Frage lautet jedoch: Muss ich dictin meiner __init__()Methode ein privates Mitglied erstellen ? Ich verstehe den Sinn davon nicht, da ich das dictVerhalten bereits habe, wenn ich einfach von erbe dict.
Kann jemand darauf hinweisen, warum die meisten Vererbungsschnipsel wie die folgenden aussehen?
class CustomDictOne(dict):
def __init__(self):
self._mydict = {}
# other methods follow
Anstelle der einfacheren ...
class CustomDictTwo(dict):
def __init__(self):
# initialize my other stuff here ...
# other methods follow
Ich glaube, ich vermute, dass die Antwort auf die Frage so ist, dass Benutzer nicht direkt auf Ihr Wörterbuch zugreifen können (dh sie müssen die von Ihnen angegebenen Zugriffsmethoden verwenden).
Was ist jedoch mit dem Array-Zugriffsoperator []? Wie würde man das umsetzen? Bisher habe ich kein Beispiel gesehen, das zeigt, wie der []Operator überschrieben wird .
Wenn []in der benutzerdefinierten Klasse keine Zugriffsfunktion bereitgestellt wird, arbeiten die geerbten Basismethoden mit einem anderen Wörterbuch.
Ich habe das folgende Snippet ausprobiert, um mein Verständnis der Python-Vererbung zu testen:
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]
Ich habe folgenden Fehler erhalten:
KeyError: <integrierte Funktions-ID>
Was ist mit dem obigen Code falsch?
Wie korrigiere ich die Klasse, myDictdamit ich solchen Code schreiben kann?
md = myDict()
md['id'] = 123
[Bearbeiten]
Ich habe das obige Codebeispiel bearbeitet, um den dummen Fehler zu beseitigen, den ich gemacht habe, bevor ich von meinem Schreibtisch weggerannt bin. Es war ein Tippfehler (ich hätte ihn anhand der Fehlermeldung erkennen sollen).
dict, sollten Sie das Objekt selbst verwenden (usingsuper), anstatt es einfach an die Instanz zu delegieren.__dict__Dies bedeutet im Wesentlichen, dass Sie für jede Instanz zwei Diktate erstellen.