はい、間違いなくこれを除外する必要があります。あなたが試したのはモジュール間の循環インポートであり、それは非常に問題になる可能性があります。combat
インポートmain
およびmain
インポートの場合、インポートの実行を開始したときに実行が終了しないcombat
ため、例外が発生する可能性があります。起動スクリプトであると仮定すると、おそらくクラスをインスタンス化するか、別のモジュールからメソッドを呼び出すだけです。グローバル変数も避けてください。今は問題にならないように見えても、後で後ろに噛み付く可能性があります。main
combat
main
そうは言っても、次のようにモジュールのメンバーを参照できます。
import common
x = common.some_method_in_common()
y = common.SomeClass()
また
from common import SomeClass
y = SomeClass()
個人的には、モジュール名で修飾せずに別のモジュールからメソッドを参照することは通常避けていますが、これも合法です。
from common import some_method_in_common
x = some_method_in_common()
私は通常from ... import ...
、クラスに使用し、通常、メソッドには最初の形式を使用します。(はい、これは、モジュール自体のインポートに加えて、モジュールからの特定のクラスのインポートがあることを意味する場合があります。)しかし、これは私の個人的な慣習にすぎません。
強く推奨されない代替構文は次のとおりです。
from common import *
y = SomeClass()
これにより、アンダースコア()で始まらない現在のスコープにcommonのすべてのメンバーがインポートされ_
ます。それが落胆する理由は、名前の由来を理解しやすくなり、物事を簡単に壊してしまうからです。このインポートのペアを検討してください。
from common import *
from some_other_module import *
y = SomeClass()
どのモジュールSomeClass
から来ていますか?2つのモジュールを見に行く以外に言う方法はありません。さらに悪いことに、両方のモジュールが定義されているSomeClass
かSomeClass
、後で追加された場合はどうなりますsome_other_module
か?