递归错误:超过最大递归深度计数器

-1 投票
1 回答
58 浏览
提问于 2025-04-14 18:26

在一个旧的例子中,我尝试在Point这个类里加一个计数器成员,但运行的时候出现了一个错误,提示递归错误:达到最大递归深度!。不过,我记得几年前用早期的Python版本时并没有遇到这个错误。

补充:那行id=0是个错误。

import math
class Point():
#           id=0
            def __init__(self, x, y, z:float=0):
                import sys; print(f"{self.id=}>{sys.getrecursionlimit()}")# maximum recursion depth 1000 exceeded
                self._x = x; self._y = y; self._z = z; self.id+=1
            @property
            def x(self):
                return self._x
            @x.setter# to define a "non-public member"
            def x(self, value):
               self._x=value
            @property
            def y(self):
                return self._y
            @y.setter
            def y(self, value):
               self._y=value
            @property
            def xy(self):
                return [self._x,self._y]
            @xy.setter
            def xy(self,xval,yval):
               self._x=xval;self._y=yval
            @property
            def z(self):
                return self._z
            @z.setter
            def z(self, value):
                self._z=value
            @property
            def id(self):
                return self.id
#    @id.setter
#    def id(self, value): # raise AttributeError("Can't")
#        raise WriteCoordinateError("Point Number id is read-only")
            @property
            def distance(self):
                return round(math.dist((0, 0, 0), (self._x, self._y, self._z)))

1 个回答

1

正如JonSG所说,这个问题的原因是你有多个id的定义。在你的类的开头,你写了:id=0。但是在最后,你又把属性id(现在可以称为self.id)定义成一个返回self.id的函数。因为self.id又是一个属性,所以会调用一个名为self.id()的函数,而这个函数又返回它自己。

希望现在你能明白为什么会这样,但我再给你一个例子:

def f(x):
    return f(x)

这就是你的函数大致上在做的事情。

你可以把私有的id改名为_id,然后用return self._id来返回。

这样你的代码就变成:

class Point() # These brackets are redunant, do you want to put something in later?
    _id = 0
    ...
    ...
    @property
    def id(self):
        return self._id

撰写回答