属性 在 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
我对以下代码有一个有趣的行为:
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