【问题标题】:Property getter/setter have no effect in Python 2属性 getter/setter 在 Python 2 中无效
【发布时间】:2016-03-03 12:27:02
【问题描述】:

我对 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 的包装器。它使用 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

我做错了什么还是问题出在哪里?

【问题讨论】:

    标签: python properties python-2.x getter-setter


    【解决方案1】:

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

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

    返回new-style classes 的属性属性(派生自object 的类)。

    所以如果你从object派生出来

    class A(object):
       ...
    
    class B(object):
        ...
    

    您的代码将按预期工作。

    【讨论】:

    • 好吧,你是对的,这解决了它,但我不明白这里出了什么问题。
    • @buergi 旧式类不能有描述符。 @property 是描述符。更多信息Python Data model reference
    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多