Bオブジェクトをインスタンス化したので、B.__init__が呼び出され、属性が追加されましたz。この属性は、オブジェクトに存在するようになりました。B他の場所で記述されたコードに何らかの形でアクセスできなくなるのは、メソッドの奇妙なオーバーロードされた魔法の共有ローカル変数ではありません。そのようなことはありません。どちらもself、スーパークラスのメソッドに渡されたときに別のオブジェクトにはなりません (そうなった場合、ポリモーフィズムはどのように機能するのでしょうか?)。
また、Aオブジェクトにそのようなオブジェクトがない ( try o = A(); a.z = whatever) という宣言もありません。また、どちらも1selfのインスタンスでdoある必要はありません。実際、宣言はまったくありません。それはすべて「先に進んで試してください」です。これは一種の動的言語の定義です (動的型付けだけではありません)。A
そのオブジェクトの属性は、アクセス元の「コンテキスト」に関係なくz、常に「どこにでも」存在します2 。解決プロセスやその他のいくつかの動作のためにコードが定義されている場所は重要ではありません3。同じ理由で、C コードを書かなくてもリストのメソッドにアクセスできますlistobject.c;-) いいえ、メソッドは特別なものではありません。それらは単なるオブジェクトでもあり (functionたまたま type のインスタンス)、まったく同じルックアップ シーケンスに関与しています。
1これは少し嘘です。Python 2 ではA.do、最初の引数が を満たさない場合、実際にはエラーをスローする「バインドされたメソッド」オブジェクトになりますisinstance(A, <first arg>)。
2delまたは同等の機能 (delattrおよびフレンド)で削除されるまで。
3さて、名前マングリングがあります。理論的には、コードはスタックを検査し、それによって呼び出し元のコード オブジェクトを検査し、それによってそのソース コードの場所を検査することができます。