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.
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:
Bearbeiten: @ drone115b löste dies auch mit __init__
anstelle von __new__
in PluginMetaclass
. Das ist wahrscheinlich in den meisten Fällen der bessere Weg.
Tags und Links python metaclass factory-pattern