设置属性导致超出最大递归深度
- 2025-02-28 08:24:00
- admin 原创
- 65
问题描述:
我有以下课程:
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 以使其仅适用于固定列表?
解决方案 1:
达到最大递归深度的原因是,在 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 中的惯例,以下划线开头的所有内容都是私有的,通常不应在类之外触及。或者正如他们所说:python 是为成年人准备的 ;)。
我还稍微修改了 setter 中的错误消息。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD