在类中使用 len() *inside* 的正确方法是啥? [复制]
Posted
技术标签:
【中文标题】在类中使用 len() *inside* 的正确方法是啥? [复制]【英文标题】:What is the right way to use len() *inside* a class? [duplicate]在类中使用 len() *inside* 的正确方法是什么? [复制] 【发布时间】:2020-03-12 02:30:33 【问题描述】:我试图弄清楚len()
在使用 inside Python 类时是如何工作的。运行此代码会导致显示的错误,即使我添加了 __len__
重载并使用了 @property
,遵循来自 Internet 的各种建议。
class Routes:
def __init__(self):
self._route_list = list()
def __len__(self):
return len(self._route_list)
@property
def route_list(self):
return self._route_list
@classmethod
def check_list(self):
if not self.route_list or len(self.route_list) == 0:
print('ERROR: no items to print!')
routes = Routes()
routes.check_list()
TypeError: object of type 'property' has no len()
【问题讨论】:
“问题”是@classmethod
装饰器 - 删除它,您的代码将正常工作。你为什么首先将方法设为类方法?只有类实例可以访问_route_list
另外,看起来你的 if 子句 not self.route_list
和 len(self.route_list) == 0
正在检查同样的事情。
@MikeScotty 我虽然 @classmethod
和 @staticmethod
就像 C 中的非静态和静态方法。看起来这两个装饰器都是静态方法的变体,它们的缺失意味着该方法是非静态的。
【参考方案1】:
class Routes:
def __init__(self):
self._route_list = list()
def __len__(self):
return len(self._route_list)
def add_route(self):
self._route_list.append("route")
routes = Routes()
print(len(routes)) # 0
routes.add_route()
print(len(routes)) # 1
当你覆盖 len 时,你就是用那个对象作为参数覆盖了对 len 的调用。当您重载任何其他类型的方法时也是如此。
【讨论】:
以上是关于在类中使用 len() *inside* 的正确方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章