es geht mir hier nur darum, ein korrektes Verständis zur Verwendung von __super__(), __init__(), __new__() usw. zu bekommen.
Ich wollte meine eigene Klasse "MyDict" bauen, von dict erben und dann die Klasse erweitern um bestimmte Funktionen.
.clear_values() soll nur die values "nullen", bzw. "none"-en (lies: Nonnen

.flip() soll Key<->Value umkehren und falls das ein Problem gibt, soll die Oberklasse (dict) entscheiden, was passiert (oder Exceptions werfen).
Beispiel, was ich mit .flip() meine:
Code: Alles auswählen
>>> d = {'Germany': 'Berlin', 'Greece': 'Athens', 'France': 'Paris', 'England': 'London'}
>>> d
{'England': 'London', 'France': 'Paris', 'Germany': 'Berlin', 'Greece': 'Athens'}
>>> d = dict((v, k) for k, v in d.items())
>>> d
{'Paris': 'France', 'Berlin': 'Germany', 'London': 'England', 'Athens': 'Greece'}
Code: Alles auswählen
class MyDict(dict):
def __init__(self,*args,**kwargs):
super(MyDict, self).__init__(*args, **kwargs)
def clear_values(self):
self.__init__(super(MyDict, self).fromkeys(self.keys()))
def flip(self):
self.__init__(((v, k) for k, v in self.items()))
1. das super(..).__init__(..) habe ich von irgendwo ausm Internet übernommen, verstehe aber nicht, warum das so gut (oder besser) ist.
Da ich keine abweichenden/neuen Attribute definiere, ist mir auch nicht klar, weshalb man hier zwingend eine __init__() angeben müsste.
2. fromkeys() ist eine Klassenfunktion, welche ein neues dict() zurückgibt. Hier verstehe ich nicht, weshalb ich zwingend super(MyDict, self) eingeben muss,
statt einfach nur super(MyDict)... ohne das self Objekt. Wozu braucht er noch das Objeckt self, wenns ne Klassenfunktion ist?
Gebe ich stattdessen super(MyDict).fromkeys(self.keys) an, komm die Fehlermeldung: AttributeError: 'super' object has no attribute 'fromkeys'
3. ich hätte erwartet, dass analog zu 2.) bzw analog zur clear_values() Funktion, dass .flip() self mit ner neuen Instanz "überschreibt" (statt merged).
Leider muss ich verstellen, dies ist nicht der Fall (siehe unten). Ich verstehe nicht, wieso und wüsste nicht, wie das Verhalten zu korriegen ist.
Code: Alles auswählen
>>> m = MyDict({'Germany': 'Berlin', 'Greece': 'Athens', 'France': 'Paris', 'England': 'London'})
>>> m
{'Germany': 'Berlin', 'Greece': 'Athens', 'England': 'London', 'France': 'Paris'}
>>> m.clear_values()
>>> m
{'England': None, 'France': None, 'Germany': None, 'Greece': None}
>>> m = MyDict({'Germany': 'Berlin', 'Greece': 'Athens', 'France': 'Paris', 'England': 'London'})
>>> m.flip()
>>> m
{'England': 'London', 'Paris': 'France', 'Athens': 'Greece', 'France': 'Paris', 'Berlin': 'Germany', 'Germany': 'Berlin', 'Greece': 'Athens', 'London': 'England'}
Danke, wie immer im Voraus.