2010-01-31 52 views
3

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) 
+8

不想这样做。你为什么认为这是一个好主意? – ironfroggy 2010-01-31 15:11:59

+0

我同意ironfroggy。你究竟在努力完成什么?你的int子类与int有什么不同? – mzz 2010-01-31 15:14:32

+0

当然,例子中的INT类只是一个例子。 – 2010-02-01 03:43:57

回答

3

我不认为你可以,除非你写自己的len。 内建len总是返回int。

+0

如果我重写len,可能是任何问题? – 2010-01-31 14:25:25

+4

@Juanjo Conti:你混淆了读过你的代码的其他开发人员,这会让你的代码更难重用。 – 2010-01-31 14:32:12

3

您将无法使用。至少如果你想让它与其他python一起工作。请参阅definition of len

调用以实现内置的 函数len()。应该返回 长度的对象,一个integer> = 0。 另外,如果对象没有定义 非零值()方法,并且其方法返回零,则在布尔型 上下文中将视为false。

斜体强调我的。

4

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

2

正如别人所说,不要这样做。考虑一下这个类的用法看起来:

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

而是侵犯了读者的期望,你为什么不只是添加不同的方法:

s.length_in_yards() 

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