我有以下课程:
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以使其仅适用于固定列表?
解决方法:
你达到最大递归深度的原因是你的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中的错误消息.
标签:python,recursion
来源: https://codeday.me/bug/20190926/1819284.html