python - 设置属性导致超过最大递归深度

标签 python recursion properties

我有以下类(class):

class vehicle(object):
    def __init__(self, name):
        self.name = name
        self.kinds_list = ["tank", "car", "motorbike", "bike", "quad" ] 

    @property
    def kind(self):
        return self.kind

    @kind.setter
    def kind(self, x):
        if x in self.kinds_list:
            self.kind = x
        else:
            raise AttributeError('No attribute {0} found !'.format(y))

设置 kind 会导致 RecursionError: maximum recursion depth exceeded,也就是堆栈溢出。

如何重写 setter 以使其仅适用于固定列表?

最佳答案

您达到最大递归深度的原因是在您的 setter 中,您执行 self.kind = ...,它递归地调用相同的 setter。您应该将该值存储为一些私有(private)属性,只需将 self.kind 重命名为 self._kind

class vehicle(object):
    def __init__(self, name):
        self.name = name
        self.kinds_list = ["tank", "car", "motorbike", "bike", "quad" ] 

    @property
    def kind(self):
        return self._kind

    @kind.setter
    def kind(self, x):
        if x in self.kinds_list:
            self._kind = x
        else:
            raise ValueError('{0} is an illegal kind of vehicle!'.format(y))

这不像其他语言那样是真正的私有(private)属性,因为没有什么可以阻止您访问 my_vehicle._kind。按照 python 中的约定,以下划线开头的所有内容都是私有(private)的,通常不应在类之外触及。或者 as they say : python 适用于同意的成年人 ;).

我还稍微修改了 setter 中的错误消息。

关于python - 设置属性导致超过最大递归深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18989362/

相关文章:

Java对象不能通过递归通过ref传递

java - 使用表数据在java中动态创建一个类

objective-c - 在 View Controller 之间传递字典

java - Tomcat - 从 JSP 访问属性

python - 修复 OpenCV Python 流摄取

python - 应用蒙版阵列 2d 到 3d

python - 上下文不打印 Django

python - 根据条件对数据帧行进行分组和平均

recursion - Prolog 程序中的无效结果

java - 递归 G(n) 函数错误