我发现以下示例有点令人惊讶:
>>> class Foo:
def blah(self):
pass
>>> f = Foo()
>>> def bar(self):
pass
>>> Foo.bar = bar
>>> f.bar
<bound method Foo.bar of <__main__.Foo object at 0x02D18FB0>>
我希望绑定方法与每个特定实例相关联,并在构造时放置在其中。似乎合乎逻辑的是,每个实例的绑定方法都必须不同,以便它知道将哪个实例传递给底层函数 - 实际上:
>>> g = Foo()
>>> g.blah is f.blah
False
但是我对这个过程的理解显然是有缺陷的,因为我不希望将函数分配给类属性会将其放入到那时已经创建的实例中。
所以,我的问题有两个——
- 为什么将函数分配给类会追溯应用于实例?造成这种情况的实际查找规则和过程是什么?
- 这是语言保证的事情,还是只是碰巧发生的事情?