Aufruf von 'super' in der von metaclass aufgerufenen Klassenmethode .__ new__

8

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.)

    
Mitar 06.10.2012, 06:48
quelle

3 Antworten

3

Wenn NewBar nicht verfügbar ist, wenn get_fields aufgerufen wird, können Sie es immer noch in der MRO von cls finden:

%Vor%

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.

    
user4815162342 06.10.2012, 07:30
quelle
0

Basierend auf der Antwort von @ user4815162342 fand ich noch einfachere Lösung:

%Vor%     
Mitar 06.10.2012 08:09
quelle
0

Ich weiß, dass die Frage spezifisch für Python 2.7 ist, aber für diejenigen, die Python 3.6 verwenden, können Sie einfach super() aufrufen.

%Vor%     
Sherpa 07.09.2017 08:38
quelle

Tags und Links