python 3.2 plugin factory: Instanziierung aus Klasse / Metaklasse

9

Ich riffe von den Informationen hier: Metaclass wird nicht in Unterklassen aufgerufen

Mein Problem ist, dass ich keine Instanz eines Objekts mit dieser Klassenregistrierung erstellen kann. Wenn ich "normale" Konstruktionsmethoden verwende, dann scheint es, Objekte korrekt zu instantiieren; Aber wenn ich versuche, das Klassenobjekt zu verwenden, das mit der Registrierung verknüpft ist, bekomme ich einen Fehler, dass ich eine falsche Anzahl von Argumenten übergebe. (Scheint die metaclass new und nicht mein Konstruktor ... ??) aufzurufen.

Ich bin nicht klar, warum es scheitert, weil ich dachte, ich sollte in der Lage sein, eine Instanz aus dem Klassenobjekt zu erstellen, indem ich die "aufrufbare" Syntax verwende.

Scheint, ich bekomme die Metaklasse in die Registrierung und nicht die Klasse selbst? Aber ich sehe keine einfache Möglichkeit, die Klasse selbst im neuen -Aufruf aufzurufen.

Hier ist mein Codebeispiel, das eine Variable 'd' nicht instanziieren kann:

%Vor%

Danke für jede Hilfe.

    
drone115b 09.05.2011, 18:17
quelle

1 Antwort

4

Ich denke, das Problem besteht darin, dass der an einen Metaklassenkonstruktor übergebene Parameter cls tatsächlich eine Referenz auf die Metaklasse ist und nicht die Klasse, die gerade erstellt wird. Da __new__ eine Klassenmethode von PluginMetaclass ist, ist sie genau wie jede normale Klassenmethode dieser Klasse zugeordnet. Wahrscheinlich möchten Sie das neu erstellte Klassenobjekt von super(PluginMetaclass, cls).__new__(..) registrieren.

Diese modifizierte Version funktionierte für mich auf 3.2:

%Vor%

und die Aufrufe von print() zeigen, was hinter den Kulissen vor sich geht:

%Vor%

Bearbeiten: @ drone115b löste dies auch mit __init__ anstelle von __new__ in PluginMetaclass . Das ist wahrscheinlich in den meisten Fällen der bessere Weg.

    
Greg Haskins 09.05.2011, 21:58
quelle