2012-02-06 10 views
8

私は少しPythonのプロパティについて混乱しています。それは、自分自身にAのプロパティをマップするためにゲッターとセッターを使用していますA.のラッパーのようなもの(もちろん1を継承経由でそれを行うにもできる)である必要があり、次のコードpythonプロパティgetter/setter confusion

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を考えてみましょう。

> 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 

は私が間違って何をやっているか、場所を正確に問題がある: 問題は、それがのpython3にしながらのpython2.6に予想通り、それは単に動作しないということ、ありますか?

答えて

18

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

戻りnew-style classesのプロパティの属性(objectから派生したクラス)

property([fget[, fset[, fdel[, doc]]]])

だから、期待通りに動作しますobject

class A(object): 
    ... 

class B(object): 
    ... 

あなたのコードから派生します場合。

+0

あなたが正しいです、それはそれを解決しますが、私はどうにかここで間違っていることを理解していません。 – buergi

+1

@buergi旧式のクラスは記述子を持つことができません。 '@ property'は記述子です。 [Pythonデータモデルのリファレンス]の詳細(http://docs.python.org/reference/datamodel.html) – reclosedev