クラス B と C はどちらも基本クラス A から派生し、どちらも A のメソッド test() をオーバーライドしません。B は A と同じモジュールで定義されています。C は別のモジュールで定義されています。B.test() を呼び出すと「hello」と表示されるのに、C.test() を呼び出すと失敗するのはなぜですか? どちらの呼び出しも A.test() を実行することになるので、mod1 の名前空間でシンボル「メッセージ」を解決できるはずではありませんか?
また、何も見つけることができなかったので、この動作がどこに文書化されているかについてのヒントを喜んで受け取ります. C.test() が呼び出されたときに名前はどのように解決され、「メッセージ」を名前空間の 1 つに何らかの方法で注入できますか?
FWIW、私がインスタンス変数を使用していない理由 (例: set A.message = "hello") は、「グローバル」シングルトン オブジェクトにアクセスしたいので、明示的な参照先を持たせたくないためです。他のすべてのオブジェクト。
mod1.py:
import mod2
class A(object):
def test(self):
print message
class B(A):
pass
if __name__ == "__main__":
message = "hello"
A().test()
B().test()
mod2.C().test()
mod2.py:
import mod1
class C(mod1.A):
pass
出力は次のとおりです。
$ python mod1.py
hello
hello
Traceback (most recent call last):
File "mod1.py", line 14, in <module>
mod2.C().test()
File "mod1.py", line 5, in test
print message
NameError: global name 'message' is not defined
どうもありがとう!