我认为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)
产生预期的答案?