2017-08-27 1 views
0
Eigenschaften

Mein Code aufzurufen:Wie weiß Python Setter/Getter-Methoden mit

class MyClass: 

    def __init__(self): 
     self.value = 0 

    def set_value(self, value): 
     self.value = 5 

    def get_value(self): 
     return self.value 

    value = property(get_value, set_value) 

a = MyClass() 

ich folgende Ausgabe:

RecursionError: maximum recursion depth exceeded 

Meine Frage: Warum ich diese Ausgabe erhalten? Warum ruft Python MyClass.value .__ set__ anstatt nur die Instanzvariable auf 0?

Ich meine, das Eigenschaft-Objekt ist eine Klassenvariable und bei der Initialisierung der a -Instanz mache ich nichts mit der Klassenvariablen. Ich hoffe du weißt was ich meine.

+0

Interessante Ausgabe, hätte ich nicht erwartet. Ich wollte nur hinzufügen, dass das "Problem", eine private Variable zu erstellen (durch "__value" ersetzt), das Problem löst. – Michael

+1

@Michael, das macht es nicht privat, es nennt nur Mangles es. Solange das Attribut hinter der Eigenschaft einen anderen Namen hat (konventionell mit einem * einzigen * führenden Unterstrich, könnte aber etwas völlig anderes sein), gibt es keine Rekursion. – jonrsharpe

+1

Es ruft 'MyClass.value .__ set__', weil * so die Eigenschaften funktionieren *. Andernfalls würden Sie die Eigenschaft sofort durch einen Wert ersetzen, sobald Sie ihr zugewiesen wurden. – jonrsharpe

Antwort

0

Indem Sie value = property(get_value, set_value) tun, deklarieren Sie einen neuen Deskriptor. Von jetzt an rufen instance.value und instance.value = x.get_value() und .set_value() auf.

+0

Der Grund warum ist hier: https://Stackoverflow.com/a/36607870/5005715 – Aliquis

Verwandte Themen