属性 在 Python 和 @property.getter

Property in Python with @property.getter

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

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 2 上执行,则为您的)赋值 obj.age = 11 将 'override' 描述符。见 New Class vs Classic Class:

New Style classes can use descriptors (including __slots__), and Old Style classes cannot.

你可以在 Python 3 上实际执行它并让它正确执行,或者,如果你需要一个在 Python 2 和 3 中表现相似的解决方案,继承自object 并使其成为新样式 Class:

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