Property getter/setterはPython 2では効果がありません

私は少しPythonのプロパティについて混乱しています。以下のコードを考えてみましょう。

class A:
    @property
    def N(self):
        print("A getter")
        return self._N
    @N.setter
    def N(self,v):
        print("A setter")
        self._N = v

    def __init__(self):
        self._N = 1

class B:
    @property
    def N(self):
        print("B getter")
        return self.a.N
    @N.setter
    def N(self,v):
        print("B setter")
        self.a.N = v

    def __init__(self):
        self.a = A()

if __name__ == '__main__':
    b=B()
    b.N = 2
    print(b.N, b.a.N)
    b.N = 3
    print(b.N, b.a.N)

BはAのラッパーのようなものでなければなりません。ゲッターとセッターを使ってAのプロパティをマップします(もちろん、継承でも可能です)。 問題は、Python3.6ではpython2.6では期待通りに動作しないということです。

> python2 test.py
A getter
(2, 1)
A getter
(3, 1)

> python3 test.py
B setter
A setter
B getter
A getter
A getter
2 2
B setter
A setter
B getter
A getter
A getter
3 3

私は間違ったことをやっているのですか?

8

1 答え

AとBは、Python 2.xでは新しいスタイルのクラスでなければなりません。

プロパティ([fget [、fset [、fdel [、doc]]]))/code>

新しいスタイルのクラス(< a href = "http://docs.python.org/library/functions.html#object">オブジェクト)。

So if you'll derive from object

class A(object):
   ...

class B(object):
    ...

あなたのコードは期待どおりに動作します。

20
追加された
@buergi古いスタイルのクラスは記述子を持つことができません。 @property は記述子です。 Pythonデータモデルリファレンスの詳細
追加された 著者 reclosedev,
あなたは正しいです、それはそれを解決しますが、私はどうにかここで間違っていることを理解していません。
追加された 著者 buergi,