我对以下代码有一个令人兴奋的行为:
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