Normalerweise werden Python-Deskriptoren als Klassenattribute definiert. Aber in meinem Fall möchte ich, dass jede Objektinstanz unterschiedliche Deskriptoren hat, die von der Eingabe abhängen. Zum Beispiel:
%Vor%Jedes Objekt hat unterschiedliche Attribute, die zur Instanziierungszeit festgelegt werden. Da es sich um einmalige Objekte handelt, ist es nicht zweckmäßig, sie zuerst zu unterklassifizieren.
%Vor%Zuweisen des Deskriptors zum Objekt scheint nicht zu funktionieren. Wenn ich versuche, auf das Attribut zuzugreifen, habe ich etwas wie
%Vor%Weißt du, warum funktioniert das nicht? Gibt es irgendwelche Arbeiten?
Dies funktioniert nicht, weil Sie den Deskriptor der Klasse des Objekts zuweisen müssen.
%Vor%wenn Sie
schreiben %Vor%Es funktioniert also nicht, weil der Typ Dictionary nach Deskriptoren und nicht nach Objekt Dictionary gesucht wird.
Es gibt mögliche Arbeitsumgebungen:
Setzen Sie den Deskriptor in die Klasse und verwenden Sie z. obj.xxxattr zum Speichern des Wertes. Wenn es nur ein Deskriptor-Verhalten gibt, funktioniert dies.
überschreiben Sie setattr und getattr und delattr , um auf die Deskriptoren zu antworten.
fügen Sie einen Deskriptor in die Klasse ein, die auf Deskriptoren reagiert, die im Objekt Dictionary gespeichert sind.
Sie verwenden Deskriptoren falsch.
Deskriptoren sind auf Instanzebene nicht sinnvoll. Nach all dem __get__
/ __set__
Methoden geben Ihnen Zugriff auf die instance
der Klasse.
Ohne zu wissen, was genau Sie tun möchten, würde ich vorschlagen, dass Sie die pro-Instanz setzen
Logik innerhalb der Methode __set__
, indem Sie überprüfen, wer der "Aufrufer / Instanz" ist und entsprechend handeln.
Anderenfalls sagen Sie uns, was Sie erreichen möchten, damit wir alternative Lösungen vorschlagen können.
Der Grund, warum es nicht funktioniert, ist, weil Python nur nach Deskriptoren sucht, wenn nach Attributen in der Klasse und nicht nach der Instanz gesucht wird; Die Methoden sind:
Es ist möglich, diese Methoden in Ihrer Klasse zu überschreiben, um das Deskriptorprotokoll sowohl auf Instanzen als auch auf Klassen:
%Vor%Wenn die obige Klasse wie folgt verwendet wird:
%Vor%Die Ergebnisse sind:
Hallo!
GROSS
wirklich?
kann das Attribut
nicht löschenHallo!
kann das Attribut
nicht löschenwirklich?
Ich erstelle dynamisch Instanzen von exec
in einer erfundenen Klasse. Dies kann zu Ihrem Anwendungsfall passen.
Test;
%Vor%Aber die Instanzen sind von unterschiedlicher Klasse.
%Vor%Tags und Links python metaprogramming propertydescriptor