Python - 列表中的属性设置导致超出最大递归深度

时间:2013-09-24 18:33:28

标签: python recursion

我有以下课程:

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))

设置种类导致超出最大递归深度又称堆栈溢出。

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

1 个答案:

答案 0 :(得分:24)

您达到最大递归深度的原因是在您的setter中,您执行self.kind = ...,它递归调用相同的setter。您应该将该值存储为某个私有属性,只需将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))

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

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