我正在摆弄python中的属性描述符,但是出现了一个有趣的错误(至少对我来说)(recursionerror)。这是导致它的代码
class Employer:
def __init__(self, age, name):
self.age = age
self.name = name
def get_age(self):
return self.age
def set_age(self, value):
if value > 30:
raise ValueError("Our company doesn't want old people")
self.age = value
def deleter(self):
del self.age
age = property(get_age, set_age, deleter)
emp = Employer(20, "Alex")
现在,在我改变自我之后。在setter方法中Age为self。在getter和deleter方法中做同样的事情,一切都很好,但我不太明白为什么。我看了文档,但我真的不明白:"名称混淆有助于让子类重写方法而不会破坏类内方法调用。"当我得到递归错误时,我估计有什么东西坏了,但对我来说似乎没有。按照我的推理:
- 我定义了要存储在字典中的属性
- 我使用self.attribute_name修改该属性我的意思是,似乎有些东西已经运行时,我试图修改使用我的方法的属性名称。有人能把私有变量的概念和属性描述符联系起来吗,因为这可能就是问题所在。谢谢您的关注。
self.age
是具有设置逻辑set_age
的描述符。执行self.age = ...
时,调用set_age
由于对self.age
的赋值发生在set_age
中,因此得到无限递归。
您可以这样做以避免名称冲突。
class Employer:
def __init__(self, age, name):
self.__age = age
self.__name = name
@property
def age(self):
return self.__age
@age.setter
def age(self, value):
if value > 30:
raise ValueError("Our company doesn't want old people")
self.__age = value
@age.deleter
def age(self):
del self.__age