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?)中实例化我的对象,并将它们导入到需要访问它们的每个模块中吗?
是的,你绝对应该考虑到这一点.您尝试过的是模块之间的循环导入,这可能非常有问题.如果是combat导入main和main导入combat,那么您可能会遇到异常,因为main在combat开始执行导入时将无法完成执行.假设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来自哪个?除了看两个模块之外别无他法.更糟糕的是,如果两个模块定义SomeClass或SomeClass稍后添加到some_other_module什么?