在Python中存储项目范围的全局对象
我有一个简单的游戏项目,结构大概是这样的:
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
这样做可以让你在代码中很容易识别这些变量是常量。