Wenn ich nachschaue, wie super () funktioniert, habe ich dieses Beispiel gefunden :
%Vor%Kann jemand erklären, wie das auf magische Weise funktioniert?
Dies erscheint auch in der Python-Dokumentation
OrderedCounter wird als Beispiel in der OrderedDict-Dokumentation und funktioniert, ohne dass Methoden außer Kraft gesetzt werden müssen:
%Vor% Wenn eine Klassenmethode aufgerufen wird, muss Python die richtige Methode finden. Es gibt eine definierte Reihenfolge, in der die Klassenhierarchie "Methodenauflösungsreihenfolge" oder mro durchsucht wird. Der mro wird im Attribut __mro__
:
Wenn eine Instanz von OrderedDict __setitem__()
aufruft, durchsucht sie die Klassen in der folgenden Reihenfolge: OrderedCounter
, Counter
, OrderedDict
(wo sie gefunden wird). Eine Anweisung wie oc['a'] = 0
ruft also OrderedDict.__setitem__()
auf.
Im Gegensatz dazu wird __getitem__
nicht von einer der Unterklassen im mro überschrieben, sodass count = oc['a']
von dict.__getitem__()
behandelt wird.
Eine interessantere Aufruffolge tritt für eine Anweisung wie oc.update('foobar').
auf. Zuerst wird Counter.update()
aufgerufen. Der Code für Counter.update()
verwendet self [elem], was zu einem Aufruf von OrderedDict.__setitem__()
wird. Und der Code für das ruft dict.__setitem__()
auf.
Wenn die Basisklassen umgekehrt sind, funktioniert es nicht mehr. Weil der MRO anders ist und die falschen Methoden aufgerufen werden.
%Vor%Weitere Informationen zu mro finden Sie in der Python 2.3 Dokumentation .
Tags und Links python python-3.x