【问题标题】:How does len work?len 是如何工作的?
【发布时间】:2011-01-11 10:23:24
【问题描述】:

len 在 Python 上是如何工作的?

看这个例子:

class INT(int):
    pass

class STR(str):

    def __len__(self):
        return INT(42)

q = STR('how').__len__()
print q, type(q)
q = len(STR('how'))
print q, type(q)

输出是:

42 <class '__main__.INT'>
42 <type 'int'>

我如何处理它以便 len 返回一个 INT 实例?

答案表明唯一的解决方案是覆盖 len

这是我的替代实现。它似乎不是很有害。

original_len = len
def len(o):
    l = o.__len__()
    if isinstance(l, int):
        return l
    original_len(o)

【问题讨论】:

  • 不想这样做。为什么你认为这是一个好主意?
  • 我同意铁蛙的观点。你实际上想要完成什么?您的 int 子类与 int 有何不同?
  • 当然,示例中的 INT 类只是一个示例。

标签: python


【解决方案1】:

我认为你不能,除非你自己写 len。 内置 len 总是返回一个 int。

【讨论】:

  • 如果我覆盖 len 会有什么问题吗?
  • @Juanjo Conti:你让阅读你代码的其他开发人员感到困惑,这让你的代码更难重用。
【解决方案2】:

你将无法做到。至少如果您希望它与 python 的其余部分一起使用。见definition of len

调用实现内置 函数 len()。应该返回 对象的长度,一个 整数 >= 0。 此外,一个没有定义 nonzero() 方法并且其 len() 方法返回零在布尔值中被认为是 false 上下文。

斜体强调我的。

【讨论】:

    【解决方案3】:

    不要这样做。你需要了解什么时候最好的答案是根本不做你想做的事情。这是其中之一。

    【讨论】:

      【解决方案4】:

      正如其他人所说,不要这样做。考虑一下这个类的用法:

      length = len(s)     # the reader assumes `q` is an int.
      length.in_yards()   # the reader is going WTF?!
      

      与其违背读者的期望,不如干脆添加一个不同的方法:

      s.length_in_yards()
      

      附:不能解决这个问题,但如果您有充分的理由编写自定义的类整数对象,您可能会对 __index__ 特殊方法感兴趣,该方法允许此类对象直接用于索引内置序列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-24
        • 2016-11-13
        • 2017-10-11
        相关资源
        最近更新 更多