【问题标题】:len() function not working properly in Pythonlen() 函数在 Python 中无法正常工作
【发布时间】:2016-04-19 05:41:04
【问题描述】:

我有以下代码:

class Stat(list):
    def __init__(self, lst = []):
        self.s = list(lst)

    def __repr__(self):
        return "Stat({})".format(self.s)

    def add(self, item):
        self.s.append(item)

    def len(self):       
        return len(self.s)

...(more methods, but not necessary)

除了len(),所有方法都可以正常工作。无论Stat对象的长度如何,返回的长度始终为0;我不明白为什么。

【问题讨论】:

  • 如何创建 Stat 对象并调用len 方法?
  • 首先在第一个数组中添加一些项目
  • 你可能不应该从list继承。
  • 如果你想能够做到len(Stat()),特殊方法名是__len__。在当前类上调用len 方法(因为它只是一个名为len 的方法)的正确方法是Stat().len()。但是你不需要继承 list 来做这些。选择包装list(具有self.s)或继承它之一。
  • 关于不继承自列表的说明,进一步阅读here

标签: python list function


【解决方案1】:

当你像这样使用它时,它总是返回 0:

x = Stat([1,3,4,5])
print len(x)

如果您想覆盖 len 函数,请使用以下代码:

def __len__(self):       
    return len(self.s)

【讨论】:

  • 这解决了!不知道为什么我没有尝试这个...谢谢!
  • @Frank 我认为你继承自 list 是为了能够做到 len(myobj)。既然您知道def __len__(self) 是能够做到len(myobj) 的关键,请认真考虑不要从list 继承。
【解决方案2】:
s = Stat([1, 2])
s.add(1)
s.add(2)
print s.len()

我已经运行了你的代码,结果在我的环境中是正确的。

【讨论】:

  • 当调用length方法时应该调用len(object)
  • @Frank 你必须覆盖 __len__ 然后
【解决方案3】:

重写魔术方法__len__(self) 以控制对len(my_stat_object) 的调用的输出:

class Stat(list):
    def __init__(self, lst = []):
        self.s = list(lst)

    def __repr__(self):
        return "Stat({})".format(self.s)

    def add(self, item):
        self.s.append(item)

    def __len__(self):       
        return len(self.s)

【讨论】:

    【解决方案4】:

    如果您尝试运行的是len(stat) 而不是stat.len(),则您的函数len 应命名为__len__。这是文档:object.len

    stat = Stat([1, 2])
    len(s) # 0 if len, 2 if __len__
    

    作为旁注,您可能希望在您的 init 定义中替换 lst=[],因为它可能会导致一些奇怪的行为。在这里阅读:mutable default argument

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-23
      • 2019-03-05
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      相关资源
      最近更新 更多