次の例はやや意外です。
>>> 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
しかし、関数をクラス属性に割り当てると、それまでにすでに作成されていたインスタンスに関数が配置されるとは思わないため、プロセスの理解には明らかに欠陥があります。
だから、私の質問は2つあります-
- 関数をクラスに割り当てると、インスタンスにさかのぼって適用されるのはなぜですか?これを実現する実際のルックアップルールとプロセスは何ですか?
- これは言語によって保証されているものですか、それともたまたま起こっていることですか?