递归错误:超出最大递归深度 - 简单程序



我试图在Python中为一个Test类测试property()函数,我创建了简单的fget,fset,fdel等效方法。当我运行一个简单的测试时,我遇到了RecursionError,SO上有多个这样的场景,但没有一个像我这样简单明了,有人可以帮助我理解这里的问题吗?我正在使用Python 3.7.

class Test:
def __init__(self, value):
self.value = 100
def getvalue(self):
return self.value
def setvalue(self, value):
self.value = value
def deletevalue(self):
del self.value
value = property(getvalue, setvalue, deletevalue)

if __name__ == '__main__':
t = Test(10)
print(t.value)
t.value = 200
print(t.value)
del t.value
print(t.value)

Traceback (most recent call last):File "/Users//PycharmProjects/Test/Helloworld/T2.py", line 20, in <module> t = Test(10) File "/Users//PycharmProjects/Test/Helloworld/T2.py", line 4, in __init__ self.value = 100 File "/Users//PycharmProjects/Test/Helloworld/T2.py", line 10, in setvalue self.value = value File "/Users//PycharmProjects/Test/Helloworld/T2.py", line 10, in setvalue self.value = value File "/Users//PycharmProjects/Test/Helloworld/T2.py", line 10, in setvalue self.value = value [Previous line repeated 994 more times] RecursionError: maximum recursion depth exceeded

Process finished with exit code 1

原因是您将实例变量类变量(这是property)命名为相同的东西:value

因此,当你调用__init__时,它会尝试调用setvalue,后者调用自己,依此类推......

变量基础属性应该以不同的方式命名(官方示例使用前面的下划线):

class Test:
def __init__(self, value):
self._value = 100
def getvalue(self):
return self._value
def setvalue(self, value):
self._value = value
def deletevalue(self):
del self._value
value = property(getvalue, setvalue, deletevalue)

if __name__ == '__main__':
t = Test(10)
print(t.value)
t.value = 200
print(t.value)
del t.value
print(t.value)

这给出了预期的结果:

100
200
AttributeError: 'Test' object has no attribute '_value'

最新更新