python列表最大容量_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))

设置种类会导致超出最大递归深度,即堆栈溢出.

问:如何重新编写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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值