【问题标题】:Property in Python with @property.getter在 Python 中使用 @property.getter 的属性
【发布时间】:2016-11-21 20:59:05
【问题描述】:

我对以下代码有一个有趣的行为:

class MyClass:
    def __init__(self):
        self.abc = 10

    @property
    def age(self):
        return self.abc

    @age.getter
    def age(self):
        return self.abc + 10

    @age.setter
    def age(self, value):
        self.abc = value

obj = MyClass()
print(obj.age)
obj.age = 12
print(obj.age)
obj.age = 11
print(obj.age)

我得到以下结果:

20
12
11

有人可以解释这种行为吗?

【问题讨论】:

  • 你确定你使用的是 Python 3 吗?这看起来像 Python 2 的行为。

标签: python python-3.x properties python-2.x


【解决方案1】:

在旧样式类(如果您在 Python 2 上执行,您的类)分配 obj.age = 11 将“覆盖”描述符。见New Class vs Classic Class

新样式类可以使用描述符(包括__slots__),而旧样式类不能。

您可以在 Python 3 上实际执行它并使其正确执行,或者,如果您需要在 Python 2 和 3 中表现类似的解决方案,则从 object 继承并使其成为新样式类:

class MyClass(object):
    # body as is

obj = MyClass()
print(obj.age)   # 20
obj.age = 12
print(obj.age)   # 22
obj.age = 11
print(obj.age)   # 21

【讨论】:

  • 谢谢,看来你是对的。我已经检查了 python 3 并得到了你所描述的结果(我的偏好有问题,我认为我使用的是 python 3)。但我还有一个问题:在这种情况下,函数:{code} property def age(self): return self.abc {/code} 这个函数可用吗?因为它是阴影的: {code} age.getter def age(self): return self.abc + 10 {/code}
  • @ДенисКотов 如果您将age.getterdef age(self):.. 一起使用,您将无法使用名称为age 的另一个函数,当您从@987654333 继承时,这适用于Python 2 @ 和 Python 3 默认情况下。你问的是这个吗?
  • 是的,我问过。但我很好奇,如果我们可以使用默认的装饰器,为什么在这种情况下我们需要 age.getter 装饰器?
  • 啊,看看这个很好的答案以获得很好的解释:stackoverflow.com/questions/1554546/…
  • 我的意思是属性 def age(self): return self.abc 没用,因为我们有age.getter def age(self): return self.abc + 10。这是什么原因?我们失去了方法......(
猜你喜欢
  • 2021-05-27
  • 2012-12-17
  • 2016-07-08
  • 2011-08-06
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多