Abfangen von Änderungen an einem veränderbaren Attribut in Python

10

Ich verwende Eigenschaften, um bei jeder Änderung eines Attributs einen Code auszuführen:

%Vor%

Und das funktioniert großartig:

%Vor%

Wenn ich stattdessen ein veränderbares Objekt in attr speichere, kann attr direkt geändert werden, indem der Setter und mein Change-Detection-Code umgangen werden:

%Vor%

Nehmen wir an, dass attr immer nur zum Speichern eines Objekts vom Typ Container verwendet wird. Gibt es eine elegante Möglichkeit, SomeClass und / oder Container so zu ändern, dass SomeClass execute _on_change immer dann gemacht wird, wenn das in Container gespeicherte attr -Objekt geändert wird? Mit anderen Worten, ich möchte, dass meine Ausgabe lautet:

%Vor%     
Emma 08.11.2013, 22:38
quelle

3 Antworten

3

Hier ist eine Version von SomeClass und Container , von der ich denke, dass sie das gesuchte Verhalten hat. Die Idee dabei ist, dass Änderungen an Container die _on_change() -Funktion der SomeClass -Instanz aufrufen, die damit verknüpft ist:

%Vor%

Beispiel:

%Vor%

Beachten Sie, dass die einzige Änderung an SomeClass die zweite Zeile in __init__() war. Ich habe den vollständigen Code einfach der Vollständigkeit und dem einfachen Testen hinzugefügt.

    
Andrew Clark 08.11.2013, 23:01
quelle
0

Wenn Sie Änderungen verfolgen und nicht mit dem Jonglieren mit on_change() -Methoden in verschiedenen Klassen kämpfen möchten, können Sie functools.partial wie gezeigt verwenden, beginnend mit hier .

Auf diese Weise können Sie Ihre Daten einbetten und vollständig ausblenden. Get / change wird nur über einige Methoden möglich sein, die in diesem Objekt enthalten sind.

NB : Python hat keine privaten Eigenschaften und auf der Konvention, dass wir alle Erwachsene sind und gegen Regeln handeln. In Ihrem Fall sollten Benutzer Ihrer API die Daten des Containers (nach der Erstellung) nicht direkt ändern.

NB : Hier für diejenigen, die sich für andere Wege interessieren könnten ...

    
twil 08.11.2013 23:32
quelle
0

Hier ist eine andere Lösung. Eine Art Proxy -Klasse. Sie müssen keine Klassen ändern, um Änderungen an den Attributen zu überwachen, sondern nur das Objekt in ChangeTrigger abgeleitete Klasse mit ovverriden _on_change function:

umbrechen %Vor%

Beispiel:

%Vor%     
ndpu 11.11.2013 13:39
quelle

Tags und Links