为什么这个python任务没有明显的预期呢?

时间:2017-12-20 23:48:11

标签: python-3.x

这会返回您期望的内容:

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()

为什么?

2 个答案:

答案 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值得一读。你的例子几乎完全相同。