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

问题描述:

我是一个非常缺乏经验的程序员,创建一个游戏(使用Python 3.3)作为学习练习。我目前有一个主要模块和一个战斗模块。Python:从另一个模块访问对象

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

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

就目前情况来看,main.py有

import combat 

上方;加入

import main 

to combat.py似乎没有帮助。

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

是的,你绝对应该把这个分解出来。你所尝试的是你的模块之间的循环导入,这可能是非常有问题的。如果combat进口mainmain进口combat,那么您可能会遇到异常,因为maincombat开始执行导入时不会完成执行。假设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() 

这将共同的每一个成员导入到当前范围不以下划线(_)启动。我感到气馁的原因是因为它使得理解名称的来源,并且使事情变得容易。考虑这一对进口:

from common import * 
from some_other_module import * 
y = SomeClass() 

SomeClass哪个模块来自?没有办法告诉别人去看看这两个模块。更糟糕的是,如果模块定义SomeClassSomeClass后来被添加到some_other_module

+0

谢谢,这非常有帮助。 – henrebotha 2013-03-01 22:52:26

+0

不客气。如果某人提供的答案回答您的问题,则可以通过单击向上/向下选项按钮下方的复选标记将其标记为答案。 – jpmc26 2013-03-01 22:56:20

如果您通过使用import main导入了combat模块中的主模块,那么您应该使用main。*(在主模块中实现的东西)来访问那里的类和方法。

例如:

import main 

person = main.Person() 

也可以使用from main import *import Person,以避免主*在前面。

有一些规则如http://effbot.org/zone/import-confusion.htm描述导入模块:

  1. import X导入模块X,并创建在当前名字空间到 模块的引用。或者换句话说,你已经运行 这一说法后,就可以使用X.name指在 模块X.定义
  2. from X import *导入模块X的东西,并在 创建引用当前命名空间中定义的所有公共对象通过该模块 (即,没有以“_”开头的名称的所有内容)。换言之,在您运行此语句后,您可以简单地使用 一个普通名称来引用模块X中定义的内容。但X本身未定义为 ,因此X.name不起作用。如果名称已经定义了 ,它将被新版本替换。如果X中的名称是 更改为指向某个其他对象,则您的模块将不会注意到。
  3. from X import a, b, c导入模块X,并在给定对象的当前名称空间中创建引用 。换句话说,您现在可以在程序中使用abc
  4. 最后,X = __import__(‘X’)作品一样import X,与 区别,你

    1)传递模块名作为一个字符串,并

    2)明确地将其分配给在当前的命名空间的变量。

+0

D'oh!我忘了这件事。愚蠢的错误。 – henrebotha 2013-03-01 22:51:56

+2

请不要暗示'从X导入*' – 2013-03-01 22:53:42