这会返回您期望的内容:
class My(object):
def __len__(self):
return 6
a = My()
print(len(a))
但这会引发错误:
class My2(object):
pass
b = My2()
b.__len__ = lambda x: 6
print(len(b))
TypeError: object of type 'My2' has no len()
为什么?
答案 0 :(得分:5)
这是因为您尝试在实例上定义方法而不是在基础类上。例如,这将起作用:
class My2(object):
pass
b = My2()
b.__class__.__len__ = lambda x: 6
print(len(b)) # Prints 6
此外,为了澄清这些评论,这不是一个lambda或函数的问题,这证明这不起作用:
class My2(object):
pass
def l(x):
return 6
b = My2()
b.__len__ = l
print(len(b)) # TypeError: object of type 'My2' has no len()
答案 1 :(得分:2)
在Python len(a)
中作为其他“魔术”函数,是type(a).__len__(a)
的简写。
因此,无法通过__len__
访问您在实例b
上定义的函数(与方法相对)len
,因为调用将被解析为:
type(b).__len__(b)
但type(b)
没有方法__len__
。
我问了一个类似的问题并得到了一个非常好的答案here
documentation值得一读。你的例子几乎完全相同。