len如何工作?

时间:2010-01-31 14:16:11

标签: python

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)

4 个答案:

答案 0 :(得分:4)

不要这样做。你需要知道什么时候最好的答案真的不是做你想要做的事情。这是其中一次。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

你将无法做到。至少如果你想让它与python的其余部分一起工作。请参阅definition of len

  

被调用来实现内置功能   函数len()。应该归还   对象的长度,整数&gt; = 0 。   此外,一个没有定义的对象   非零()方法且其 len ()方法返回零在布尔值中被视为false   上下文。

斜体字强调我的。

答案 3 :(得分:2)

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

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

为什么不添加不同的方法,而不是违反读者的期望:

s.length_in_yards()

P.S。不解决这个问题,但是如果你有充分的理由编写类似自定义整数的对象,你可能会对__index__特殊方法感兴趣,它允许这样的对象直接用于索引内置序列。