2016-06-01 3 views
3

私はPythonを初めて使い、プロパティを発見しました。私は単純な変数でそれを試してもうまく動作しますが、リスト上で動作させることはできません。下のコードを実行すると、setterではなくgetterが2回呼び出されます。私の例では、プロパティは付加価値がないが、単純化することを知っている。リストのPythonプロパティ

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]) 

誰かが私が間違っていることについてのアイデアはありますか?あなたc.x[1] = 4

答えて

2

セッター/ゲッターをあなたが直接プロパティを取得または設定している場合にのみ使用されます。

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

あなたが変更した場合要素を取得し、対応する要素を設定します。あなたの例では、あなたが直接特定の項目を設定し、取得できるようにする__getitem____setitem__を使用することができます

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

に相当します。

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

本当にc [1] = 3?を呼んでいますか?クラスに2つのリストがあればどうですか? –

+0

@MahshidZeinalyクラスに2つのリストがある場合は、おそらく '__getitem__'または' __setitem__'アプローチを使用しないでください。あるいは、それを大幅に変更する必要があります。私はコードを書いたときに1つのリストについて考えましたが、それ以上の情報がなければ少し曖昧です。いつどちらを変えるべきですか?または両方? – MSeifert

0

は、実際は、2つの動作に分けている:

  1. Cの "X" プロパティ(=>ゲッタ)得られたオブジェクトに
  2. 設定項目を取得します。

この問題を解決する方法は簡単ではありません。しかし、とにかく、それは最終的にあなたが望んだことをするのですか?

セッターは、あなたのようなものを書いた場合、呼び出されます:

c.x = another_list 
+0

これで、c.x [1] = 4の構文でセッタープロパティを使用する方法はありませんか? – DoubleT28

+0

いいえMSeifertの答えは、可能な選択肢を示しています。 –