Erstellen eines geordneten Zählers

10

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

    
Sean 17.02.2016, 00:59
quelle

1 Antwort

12

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__ :

gespeichert %Vor%

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.

%Vor%

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 .

    
RootTwo 17.02.2016 05:23
quelle

Tags und Links