重写__len__的MethodType不重写len

时间:2019-07-13 17:20:52

标签: python python-3.x overriding magic-methods

我认为len(foo)foo.__len__()相同。但是,使用MethodType在实例级别覆盖后一种方法时,这种等效性并不是全部。

from types import MethodType

class Foo(object):

    def __len__(self):
        return 1

def override(inst, new_length):
    inst.__len__ = MethodType(lambda x: 2, inst)

foo = Foo()
print(len(foo)) # 1
override(foo,2) 
print(len(foo)) # 1
print(foo.__len__()) # 2, not 1 !!!

以下内容提供了提示:

print(foo.__len__) # <bound method override.<locals>.<lambda> of <__main__.Foo object at 0x7f4a5d9f88d0>>
foo2 = Foo()
print(foo2.__len__) # <bound method Foo.__len__ of <__main__.Foo object at 0x7f4a56b487f0>>

问题1:为什么上述解释了预期行为的差异?

问题2:如何使用MethodType覆盖foo.__len__,以便len(foo)产生预期的答案?

0 个答案:

没有答案