2016-05-13 11 views
-1

Ich versuche, über Getter und Setter mit Python zu lernen. Ich verstehe die Grundidee, aber ich kann es nicht die Eigenschaft Dekorateur an die Arbeit mit,Wie kann ich ein Attribut mit @property in Python ändern?

class f(object): 
    def __init__(self): 
     self.de = ['d', 'd'] 
    @property 
    def d(self): 
     return self.de 
    @d.setter 
    def d(self, value): 
     self.d = value 

f = f() 
f.d(1) 

Als ich dies betreibe ich eine Art Fehlermeldung erhalten; 'Listenobjekt ist nicht aufrufbar'

+1

'd' in der '@ setter' und' de' im Konstruktor? Beachten Sie auch, dass Ihr 'de' eine Liste ist, also würden Sie den' Wert' zur Liste hinzufügen und nicht die gesamte Liste überschreiben oder das Argument umbenennen, um zu verdeutlichen, dass es sich um eine neue Liste handelt, die die bestehende ersetzt . – Jens

+0

'f.d [1]' wird funktionieren – robyschek

Antwort

0

Der ganze Sinn der Verwendung eines property ist, dass es syntaktisch identisch mit dem regulären Attributzugriff ist. Also:

f = f() 
f.d = 1 

(Aber ich denke, Sie Einstellung self.de = value in Ihrem Setter werden soll.)

+0

ja das ist, wie ich es das erste Mal gemacht habe, aber ich bekomme Fehler von ipython. –

+0

Ohne 'self.de = Wert' im Setter wird die maximale Rekursionstiefe überschritten. Der interne Wert "self.d =" wird zu einem Aufruf an den Setter erweitert, der zu einem Aufruf an den Setter erweitert wird, und so weiter. Der Fehler, den Sie zuvor bekommen haben, war woanders, wie der 'f.d (1)' Fehler in Ihrem Beispiel, mit 'f.d' das Zurückgeben einer Liste? – Neapolitan

0

Hier ist ein Beispiel dafür, wie eine Eigenschaft mit einem Setter zu verwenden. Ein paar Dinge zu bemerken:

  • Eigenschaften sind wie Attribute, erhalten Sie mit object.property. Sie sind keine Methoden, also rufst du sie nicht an.
  • Sie legen Eigenschaften genau wie Attribute fest. Wenn eine Eigenschaft festgelegt wird, wird die Setter-Funktion aufgerufen. In diesem Fall someLength.inFeet = 2.5
  • Sie sollten nicht versuchen, die Eigenschaft innerhalb die Setter-Funktion zu setzen, dh self.inFeet = ... innerhalb des inFeet Setter verwenden. Dies erzeugt eine unendliche (rekursive) Schleife von Setter-Aufrufen.

Die exmaple:

class Length(object): 
    def __init__(self, inInches): 
     self.inInches = inInches 

    @property 
    def inFeet(self): 
     return self.inInches/12. 

    @inFeet.setter 
    def inFeet(self, valueInFeet): 
     self.inInches = valueInFeet * 12. 

someLength = Length(12.) 
print someLength.inInches 
# 12.0 
print someLength.inFeet 
# 1.0 
someLength.inFeet = 2.5 
print someLength.inInches 
# 30.0 
Verwandte Themen