是的,你应该考虑到这一点。您尝试的是模块之间的循环导入,这通常会导致比它解决的问题更多的问题。如果combat
进口main
and main
进口combat
,那么您可能会收到错误,因为某些对象定义将丢失main
当您尝试导入它们时。这是因为main
尚未完成执行时combat
开始执行导入。假设main
是您的启动脚本,它应该只是通过调用另一个模块的方法来启动程序;如果所需的方法是类的实例方法,它可以实例化一个对象。也避免全局变量。即使现在看起来它们不会成为问题,但以后也会给你带来麻烦。
也就是说,您可以像这样引用模块的成员:
import common
x = common.some_method_in_common()
y = common.SomeClass()
or
from common import SomeClass
y = SomeClass()
就我个人而言,我通常避免在不使用模块名称限定它的情况下引用另一个模块中的方法,但这也是合法的:
from common import some_method_in_common
x = some_method_in_common()
我通常使用from ... import ...
对于类,我通常使用第一种形式作为方法。 (是的,这有时意味着除了导入模块本身之外,我还从模块导入了特定的类。)但这只是我个人的惯例。
其替代语法是strongly灰心 is
from common import *
y = SomeClass()
这会将 common 的每个成员导入到当前作用域中,该作用域不以下划线开头(_
)。不鼓励这样做的原因是它使识别名称的来源变得更加困难,并且使破坏事物变得太容易。考虑这对导入:
from common import *
from some_other_module import *
y = SomeClass()
哪个模块做的SomeClass
来自?除了查看这两个模块之外,没有其他办法可以区分。更糟糕的是,如果both模块定义SomeClass
or SomeClass
后来添加到some_other_module
?