gpt4 book ai didi

python - 从另一个模块访问对象

转载 作者:太空狗 更新时间:2023-10-30 02:21:36 25 4
gpt4 key购买 nike

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

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

如何允许其他模块访问 main.py 中的 Persons?

就目前而言,main.py 有

import combat

在顶部;添加

import main

to combat.py 似乎没有帮助。

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

最佳答案

是的,你应该考虑到这一点。您尝试的是模块之间的循环导入,这通常会导致比解决问题更多的问题。如果 combat 导入 mainmain 导入 combat,那么你可能会得到一个错误,因为一些对象定义将丢失当您尝试导入它们时从 main 。这是因为 combat 开始执行导入时 main 还没有执行完。假设 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 ...,对于方法,我通常使用第一种形式。 (是的,这有时意味着除了导入模块本身之外,我还从模块导入了特定的类。)但这只是我个人的约定。

另一种语法是 strongly discouraged

from common import *
y = SomeClass()

这会将 common 的每个成员导入到当前作用域中,但不以下划线 (_) 开头。之所以不鼓励,是因为它使识别名称的来源变得更加困难,并且使破坏变得太容易了。考虑这对导入:

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

SomeClass 来自哪个模块?除了去看看这两个模块之外,没有其他办法可以分辨。更糟糕的是,如果 两个 模块都定义了 SomeClassSomeClass 稍后添加到 some_other_module 会怎么样?

关于python - 从另一个模块访问对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15168024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com