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)
答案 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__
特殊方法感兴趣,它允许这样的对象直接用于索引内置序列。