我是一个非常缺乏经验的程序员,创建一个游戏(使用Python 3.3)作为学习练习。我目前有一个主模块和一个战斗模块。
游戏中的人员由类" Person"的实例表示,并在主模块中创建。但是,战斗模块显然需要访问这些对象。此外,我可能会在以后创建更多模块,这些模块也需要访问这些对象。
如何允许其他模块从main.py访问人员?
根据情况,main.py有
import combat
在顶部;加入
import main
to combat.py似乎没有帮助。
我应该在单独的模块中实例化我的对象(common.py?)并将它们导入到需要访问它们的每个模块中?
答案 0 :(得分:6)
是的,你一定要考虑到这一点。您尝试过的是模块之间的循环导入,这可能非常有问题。如果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
来自哪个模块?除了看两个模块之外别无他法。更糟糕的是,如果两个模块定义SomeClass
或SomeClass
后来添加到some_other_module
会怎么样?
答案 1 :(得分:1)
如果您使用combat
在import main
模块中导入了主模块,那么您应该使用main。*(在主模块中实现的东西)来访问那里的类和方法。
示例:
import main
person = main.Person()
您也可以使用from main import *
或import Person
来避免使用上一个。*。
有一些导入模块的规则,如http://effbot.org/zone/import-confusion.htm:
中所述import X
导入模块X,并创建对该模块的引用
当前命名空间中的模块。或者换句话说,在你跑完之后
在此声明中,您可以使用X.name
来引用中定义的内容
模块X。from X import *
导入模块X,并在其中创建引用
当前命名空间到该模块定义的所有公共对象
(即没有名称以“_”开头的所有内容)。要么
换句话说,在你运行这个语句之后,你可以简单地使用
一个简单的名称来指代模块X中定义的东西。但是X本身就是
未定义,因此X.name
不起作用。如果名字已经
定义后,它将被新版本取代。如果X中的名字是
更改为指向其他对象,您的模块将不会注意到。from X import a, b, c
导入模块X,并创建引用
在当前命名空间中给定对象。或者换句话说,
您现在可以在程序中使用a
和b
以及c
。最后,X = __import__(‘X’)
的工作方式与import X
类似
1)将模块名称作为字符串传递,并
2)明确地将它分配给当前命名空间中的变量。