len是如何工作的?
在Python中,len是怎么工作的呢?
看看这个例子:
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 个回答
3
正如其他人所说,不要这样做。想想如果使用这个类会是什么样子:
length = len(s) # the reader assumes `q` is an int.
length.in_yards() # the reader is going WTF?!
与其让读者感到困惑,不如直接添加一个不同的方法:
s.length_in_yards()
附言:虽然这并没有解决问题,但如果你有充分的理由去写自定义的类似整数的对象,你可能会对__index__
这个特殊方法感兴趣,它可以让这样的对象直接用于索引内置的序列。
4
不要这样做。你需要明白,有时候最好的答案就是根本不要去做你想做的事情。这就是其中一个例子。
3
我觉得你可能做不到,除非你自己写一个 len 函数。内置的 len 函数总是返回一个整数。