Python:从另一个模块访问对象

hen*_*tha 4 python scope object

我是一个非常缺乏经验的程序员创建一个游戏(使用Python 3.3)作为一个学习练习.我目前有一个主模块和一个战斗模块.

游戏中的人员由"Person"类的实例表示,并在主模块中创建.但是,战斗模块显然需要访问这些对象.此外,我可能稍后会创建更多模块,这些模块也需要访问这些对象.

如何允许其他模块从main.py访问人员?

事实上,main.py有

import combat
Run Code Online (Sandbox Code Playgroud)

在顶部; 加入

import main
Run Code Online (Sandbox Code Playgroud)

对combat.py似乎没有帮助.

我应该在一个单独的模块(common.py?)中实例化我的对象,并将它们导入到需要访问它们的每个模块中吗?

jpm*_*c26 6

是的,你绝对应该考虑到这一点.您尝试过的是模块之间的循环导入,这可能非常有问题.如果是combat导入mainmain导入combat,那么您可能会遇到异常,因为maincombat开始执行导入时将无法完成执行.假设main是你的启动脚本,它应该只是实例化一个类或从另一个模块调用一个方法.避免全局变量.即使它们现在看起来不是一个问题,但是后来可能会让你陷入困境.

也就是说,您可以像这样引用模块的成员:

import common
x = common.some_method_in_common()
y = common.SomeClass()
Run Code Online (Sandbox Code Playgroud)

要么

from common import SomeClass
y = SomeClass()
Run Code Online (Sandbox Code Playgroud)

就个人而言,我通常避免从另一个模块引用一个方法而不用模块名称限定它,但这也是合法的:

from common import some_method_in_common
x = some_method_in_common()
Run Code Online (Sandbox Code Playgroud)

我通常from ... import ...用于类,我通常使用第一种形式的方法.(是的,这有时意味着除了导入模块本身之外,我还从模块中导入了特定的类.)但这只是我个人的惯例.

强烈建议不要使用其他语法

from common import *
y = SomeClass()
Run Code Online (Sandbox Code Playgroud)

这会将每个common的成员导入到不以下划线(_)开头的当前作用域中.我之所以气馁是因为它让人理解了这个名字的来源,这让事情变得太容易了.考虑这对进口:

from common import *
from some_other_module import *
y = SomeClass()
Run Code Online (Sandbox Code Playgroud)

哪个模块SomeClass来自哪个?除了看两个模块之外别无他法.更糟糕的是,如果两个模块定义SomeClassSomeClass稍后添加到some_other_module什么?