是的,您绝对应该考虑到这一点。您尝试的是模块之间的循环导入,这可能会带来很大的问题。如果combat 导入main 和main 导入combat,那么您可能会遇到异常,因为当combat 开始执行导入时,main 还没有完成执行。假设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 来自哪个模块?除了去看看这两个模块之外,没有别的办法。更糟糕的是,如果 两个 模块定义 SomeClass 或 SomeClass 之后被添加到 some_other_module 怎么办?