RecursionError:已超过最大递归深度-简单程序

时间:2019-05-24 01:01:05

标签: python

我试图为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

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'