Eigenschaftsdeskriptor pro Instanz erstellen?

8

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?

    
Wai Yip Tung 03.05.2012, 17:34
quelle

5 Antworten

2

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:

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

  2. überschreiben Sie setattr und getattr und delattr , um auf die Deskriptoren zu antworten.

  3. fügen Sie einen Deskriptor in die Klasse ein, die auf Deskriptoren reagiert, die im Objekt Dictionary gespeichert sind.

User 03.05.2012, 17:43
quelle
2

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.

    
rantanplan 03.05.2012 18:02
quelle
1

Dies sieht wie ein Anwendungsfall für benannte Tupel

aus     
Dave 28.10.2013 16:50
quelle
1

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öschen      

Hallo!

     

kann das Attribut

nicht löschen      

wirklich?

    
Ethan Furman 26.02.2016 17:17
quelle
1

Ich erstelle dynamisch Instanzen von exec in einer erfundenen Klasse. Dies kann zu Ihrem Anwendungsfall passen.

%Vor%

Test;

%Vor%

Aber die Instanzen sind von unterschiedlicher Klasse.

%Vor%     
Nizam Mohamed 04.03.2016 11:11
quelle