在Python中存储项目范围的全局对象

2 投票
2 回答
908 浏览
提问于 2025-04-18 08:52

我有一个简单的游戏项目,结构大概是这样的:

src:
    game.py # <- main module
    projectile.py
    enemy.py
    heroine.py

在主模块 game.py 中初始化了几个对象,我想在其他模块中使用它们,比如像 Pygame 的精灵组,或者用来瞄准敌人子弹的女主角的精灵。我真的不想把这些引用传递给构造函数。

所以问题是—— 创建一个 common.py 模块来存储全局变量可以吗? 一开始我尝试从其他模块导入 game.py,但这似乎导致了循环依赖,游戏无法启动。

2 个回答

1

你应该按照以下方式组织你的代码:

project_root/
    game/
        __init__.py # "I am package" file, can be empty
        projectile.py
        enemy.py
        heroine.py

把你的全局变量放到 __init__.py 文件里,这是存放这类东西的常见地方。

你的 __init__.py 文件可能会包含这样的内容:

CODE = "secret"
KEY = "digital"

然后在其他模块中你可以这样获取它们:

from game import CODE, KEY
print CODE
print KEY

注意,有两种导入方式 - 一种是绝对导入(使用 game 包的名称),另一种是相对导入。

保持简单,使用绝对导入,正如 PEP 8 所推荐的那样。

2

我没有看到任何说这种做法在Python中是非法或不好的。其实我在做自己游戏的时候也用过类似的方法。

我有个格式建议,就是把你的变量名用全大写字母,比如:

import common

    print common.CONSTANT1
    print common.CONSTANT2

或者

from common import *

    print CONSTANT1
    print CONSTANT2

这样做可以让你在代码中很容易识别这些变量是常量。

撰写回答