属性getter/setter在Python 2中没有任何效果

bue*_*rgi 10 python properties python-2.x getter-setter

我对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)
Run Code Online (Sandbox Code Playgroud)

B应该类似于A的包装器.它使用getter和setter来映射A的属性(当然也可以通过继承来实现).问题是,它只是在python2.6中没有按预期工作,而在python3中它是这样的:

> 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
Run Code Online (Sandbox Code Playgroud)

我做错了什么或者到底出了什么问题?

rec*_*dev 25

A和B必须是Python 2.x中的新式类.

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

返回新样式类的属性属性(从对象派生的类).

所以,如果你来自 object

class A(object):
   ...

class B(object):
    ...
Run Code Online (Sandbox Code Playgroud)

您的代码将按预期工作.