Nehmen wir als Beispiel an, ich möchte eine Unterklasse erstellen dict
und alle Schlüssel großschreiben lassen:
class capdict(dict):
def __init__(self,*args,**kwds):
super().__init__(*args,**kwds)
mod = [(k.capitalize(),v) for k,v in super().items()]
super().clear()
super().update(mod)
def __getitem__(self,key):
return super().__getitem__(key.capitalize())
def __setitem__(self,key,value):
super().__setitem__(key.capitalize(),value)
def __delitem__(self,key):
super().__detitem__(key.capitalize())
Dies funktioniert bis zu einem gewissen Grad,
>>> ex = capdict(map(reversed,enumerate("abc")))
>>> ex
{'A': 0, 'B': 1, 'C': 2}
>>> ex['a']
0
aber natürlich nur für Methoden, an deren Implementierung ich mich zum Beispiel erinnerte
>>> 'a' in ex
False
ist nicht das gewünschte Verhalten.
Die faule Art, alle Methoden auszufüllen, die aus den "Kern" -Methoden abgeleitet werden können, wäre nun das Einmischen collections.abc.MutableMapping
. Nur funktioniert es hier nicht. Ich nehme an, weil die fraglichen Methoden ( __contains__
im Beispiel) bereits von bereitgestellt werden dict
.
Gibt es eine Möglichkeit, meinen Kuchen zu haben und ihn zu essen? Etwas Magie, um MutableMapping
nur die Methoden zu sehen, die ich überschrieben habe, damit die anderen basierend auf diesen neu implementiert werden?
quelle
MutableMapping
. Siehe Wörterbuch ohne Berücksichtigung der Groß- und Kleinschreibung .os._Environ
.Antworten:
Was Sie tun könnten:
Dies wird wahrscheinlich nicht gut funktionieren (dh nicht das sauberste Design), aber Sie könnten zuerst von MutableMapping und dann von dict second erben .
Dann würde MutableMapping alle von Ihnen implementierten Methoden verwenden (da diese die ersten in der Suchkette sind):
Besserer Weg:
Der sauberste Ansatz (leicht zu verstehen und zu testen) besteht darin, nur von MutableMapping zu erben und dann die erforderlichen Methoden unter Verwendung eines regulären Diktats als Basisdatenspeicher zu implementieren (mit Zusammensetzung statt Vererbung):
quelle
super
s gegen explizitedict
s aus, dann scheint es zu funktionieren, außerlen
Rückgaben0
. Wo kommt das her?(D, MutableMapping, dict)
. Dies ist die MutableMappiing .__ len __ () -Methode, die immer 0 zurückgibt. Sie sollte nicht direkt aufgerufen werden - sie sollte immer überschrieben werden. Deshalb müssen Siedict.__len__(self)
direkt anrufen . Und das ist einer der Gründe, warum ich sagte "das wird wahrscheinlich nicht gut funktionieren" ;-)