【发布时间】:2013-09-24 18:33:28
【问题描述】:
我有以下课程:
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 会导致 超出最大递归深度,也就是堆栈溢出。
问:如何重写 setter 使其仅适用于固定列表?
【问题讨论】:
-
您只需要某些允许的属性?也许您应该改为查看
__slots__...或者__setattr__...也许如果您在一段中解释了您想要实现的目标... -
你意识到在setter中使用
self.kind = x会再次调用setter吗?为基础属性和属性使用不同的名称。 -
@JonClements 虽然不是远程堆栈溢出的原因。您的建议在这种特定情况下很有用,但一般不会帮助 OP 正确使用
@property。 -
您的 getter 和 setter 是递归定义的(
self.kind = x再次调用 setter,等等)。改用“私有”属性,例如self._kind. -
另外,您使用选中的
kinds_list而不是仅仅定义继承自vehicle的Tank、Car、[etc] 类是否有原因?