在类中使用 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_listlen(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* 的正确方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在类之间存储和传递数据的正确方法

在类中重写函数的最紧凑和最简洁的方法是啥?

在类中滚动 UIScrollBar 组件时出现问题

Python类的内置方法

如何在类中声明const并获取针对mailchimp列表的字段名称

Java语言基础——属性和局部变量的对比