Python 2中的属性getter/setter无效

11 投票
1 回答
13168 浏览
提问于 2025-04-17 12:26

我对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的属性映射到自己身上(当然,也可以通过继承来实现)。问题是,在Python 2.6中,它根本没有按预期工作,而在Python 3中却可以:

> 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

我是不是做错了什么,或者问题到底出在哪里呢?

1 个回答

28

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

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

这个功能会返回一个属性,用于新式类(也就是那些从object类派生出来的类)。

所以如果你要从object类派生的话,

class A(object):
   ...

class B(object):
    ...

你的代码就会按预期工作。

撰写回答