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

2024-05-14 03:48:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下课程:

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

设置种类会导致超过最大递归深度aka堆栈溢出。在

问:如何重新编写setter,使其只与固定列表一起工作?在


Tags: nameselfobjectinitdefcarlistclass
1条回答
网友
1楼 · 发布于 2024-05-14 03:48:07

达到最大递归深度的原因是在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中的错误消息。在

相关问题 更多 >