2016-06-01 18 views
3

Ich bin neu in Python und ich habe gerade die Eigenschaften entdeckt. Es funktioniert gut, wenn ich es auf eine einfache Variable versuche, aber ich kann es nicht auf einer Liste arbeiten lassen. Wenn Sie den folgenden Code ausführen, ruft er zweimal den Getter und nicht den Setter auf. Ich weiß, dass in meinem Beispiel die Eigenschaft keinen Mehrwert hat, aber es ist zu vereinfachen.Python-Eigenschaft auf einer Liste

class C: 
    def __init__(self): 
     self._x = [1, 2, 3] 

    @property 
    def x(self): 
     print("getter") 
     return self._x 
    @x.setter 
    def x(self, value): 
     print("setter") 
     self._x = value 

c = C() 
c.x[1] = 4 
print(c.x[1]) 

Hat jemand eine Vorstellung davon, was ich falsch mache?

Antwort

2

Der Setter/Getter nur, wenn Sie direkt erhalten oder setzen Sie die Eigenschaft verwendet:

c.x   # getter 
c.x = [1,2,3] # setter 

Wenn Sie eine ändern Element in der Eigenschaft erhalten Sie die Eigenschaft und setzen Sie dann das entsprechende Element. Ihr Beispiel ist äquivalent zu

d = c.x  # getter again 
d[1] = 4 

Sie auch __getitem__ und __setitem__ direkt verwenden können, damit einstellen und bestimmte Elemente zu bekommen.

class C: 
    def __init__(self): 
     self._x = [1, 2, 3] 

    @property 
    def x(self): 
     print("getter") 
     return self._x 
    @x.setter 
    def x(self, value): 
     print("setter") 
     self._x = value 

    def __getitem__(self, idx): 
     print("getitem") 
     return self._x[idx] 

    def __setitem__(self, idx, value): 
     print("setitem") 
     self._x[idx] = value 

>>> c = C() 
>>> c[1] = 3 
setitem 
>>> c.x 
getter 
[1, 3, 3] 
>>> c[2] 
getitem 
3 
+0

Willst du wirklich c [1] = 3 anrufen? Was wäre, wenn die Klasse zwei Listen hätte ?! –

+0

@MahshidZeinaly Wenn die Klasse zwei Listen hat, dann sollten Sie wahrscheinlich nicht die Methode "__getitem__" oder "__setitem__" verwenden, oder Sie müssen sie stark modifizieren. Ich habe nur über eine Liste nachgedacht, als ich den Code geschrieben habe, aber ohne weitere Informationen ist das ein wenig mehrdeutig. Welche sollte man wann ändern? Oder beides? – MSeifert

0

Ihre c.x[1] = 4 ist in der Tat in zwei Operationen aufgeteilt:

  1. erhält die "x" Eigenschaft von c (=> Getter)
  2. Satz Element auf dem resultierende Objekt zurück.

Es gibt keinen einfachen Weg, wie man aus diesem herauskommt. Aber am Ende macht es das, was du wolltest, oder?

Der Setter würde aufgerufen werden, wenn Sie so etwas wie schrieb:

c.x = another_list 
+0

Ok, also gibt es keine Möglichkeit, eine Setter-Eigenschaft mit der Syntax c.x [1] = 4 zu verwenden? – DoubleT28

+0

Nr. MSeiferts Antwort zeigt die mögliche Alternative. –

Verwandte Themen