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

时间:2013-03-01 22:37:15

标签: python object scope

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

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

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

根据情况,main.py有

import combat

在顶部;加入

import main

to combat.py似乎没有帮助。

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

2 个答案:

答案 0 :(得分:6)

是的,你一定要考虑到这一点。您尝试过的是模块之间的循环导入,这可能非常有问题。如果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()

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

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

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

答案 1 :(得分:1)

如果您使用combatimport main模块中导入了主模块,那么您应该使用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,并创建引用 在当前命名空间中给定对象。或者换句话说, 您现在可以在程序中使用ab以及c
  4. 最后,X = __import__(‘X’)的工作方式与import X类似

    的区别

    1)将模块名称作为字符串传递,并

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