Ich habe einen Fall, in dem meine Klasse eine benutzerdefinierte Metaklasse hat, die eine Klassenmethode der Klasse aufruft, wenn sie sie erstellt, etwa wie folgt:
%Vor%(Ein Beispiel für einen solchen Code ist in Tastypie .)
Das Problem ist, wenn ich tun möchte:
%Vor% Dies funktioniert nicht, weil NewBar
noch nicht an dem Punkt erstellt wurde, an dem super
aufgerufen wurde (der Programmablauf befindet sich immer noch in der Metaklasse). Also, gibt es eine Problemumgehung?
Ich weiß, dass get_fields
Methode möglicherweise eine Methode der Metaklasse werden könnte, aber dies würde die Implementierung von Vererbung erschweren (Sie müssten sowohl neue Metaklasse als auch Klasse selbst definieren, nicht nett für Entwickler, die diese Klassen erweitern möchten) .
(Python 2.7.)
Wenn NewBar
nicht verfügbar ist, wenn get_fields
aufgerufen wird, können Sie es immer noch in der MRO von cls
finden:
Obwohl dieser Code lustig aussieht, funktioniert er richtig und ist wesentlich einfacher als die in der Frage vorgeschlagenen Alternativen. Während die meisten Aufrufe von super
mit einem nichtkonstanten ersten Argument (wie zB unqualifizierte super(cls, cls)
) falsch sind und die Vererbung unterbrechen, ist diese Methode sicher, da der Generator-Ausdruck nichts anderes als eine unkonventionelle Methode ist, NewBar
zu erhalten. .
Bei der Suche nach den Klassen im MRO prüfen wir sowohl den Klassen- als auch den Modulnamen (verfügbar als __name__
, wie von Mitar hervorgehoben), um ein falsches positives Ergebnis zu vermeiden, wenn othermodule.NewBar
von thismodule.NewBar
erbt.
Tags und Links python inheritance super