【发布时间】:2018-02-05 04:13:41
【问题描述】:
我的代码:
class MyClass:
def __init__(self):
self.value = 0
def set_value(self, value):
self.value = 5
def get_value(self):
return self.value
value = property(get_value, set_value)
a = MyClass()
我得到以下输出:
RecursionError: maximum recursion depth exceeded
我的问题:为什么我会得到这个输出?为什么 Python 调用 MyClass.value.__set__ 而不是仅仅将 instance 变量 设置为 0?
我的意思是属性对象是一个类变量,在初始化a-instance 时,我不对类变量做任何事情。希望你明白我的意思。
【问题讨论】:
-
有趣的输出,我没想到会这样。只是想补充一点,将
value设为私有变量(替换为__value)可以解决问题。 -
@Michael 不会将其设为私有,它只是将其命名为破坏它。只要属性后面的属性具有不同的名称(通常使用 单个 前导下划线,但可能完全不同),就没有递归。
-
它调用
MyClass.value.__set__,因为这就是属性的工作方式。否则,您只需在分配给它时立即用一个值替换该属性。 -
我会在这里发布答案,但不能因为问题已关闭。我不认为它是完全重复的,因为您正在询问错误。发生的事情是您正在引入无限递归。
__init__包含self.value=0,它被解释为self.set_value(0),其中包含self.value = 5,它被解释为self.set_value(5),并且该方法再次调用自身,并且再次类似地引入无限递归。您需要为状态变量使用与属性不同的名称,_value通常是约定。
标签: python