我试图为property()
类测试Python中的Test
函数,我创建了简单的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
答案 0 :(得分:5)
原因是您将实例变量和类变量(即property
)命名为同一事物:value
。
因此,当您调用__init__
时,它会尝试调用setvalue
,后者会自行调用,依此类推...
变量基础属性的名称应不同(official example使用前面的下划线):
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'