python中的属性 @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将"覆盖"描述符。请参阅新类与经典课程:

新样式类可以使用描述符(包括__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

最新更新