从导入的脚本中使用Pygame模块

0 投票
2 回答
591 浏览
提问于 2025-04-16 10:03

大家好!

我正在制作一个简单的贪吃蛇游戏。我想把我的类分开到不同的模块里,比如把菜单类放在一个单独的脚本中,而不是和我的主游戏循环放在一起。换句话说,我希望我导入的脚本能够使用在主脚本中之前已经调用的pygame初始化。

下面是一个用伪代码简单描述我遇到的问题:

one.py

def version():
    print pygame.version

在main.py中,我导入了pygame并调用了pygame.init()。接下来,我还想在one.py中使用def version()这个函数。

main.py

import pygame
import one

pygame.init()

one.version()

但是,这样做会出现“没有定义pygame”的错误。我知道出现这个错误的原因是因为当one.py在main.py中被调用时,它并没有保留main.py中的声明。

我想知道有没有什么方法可以实现我上面提到的功能,并且能够正常工作。

谢谢!

2 个回答

1

Python的导入模型是这样的:如果你在模块d.e.f中需要使用模块a.b.c,那么你需要在d/e/f.py的开头加上一行import a.b.c(或者类似的语句)。这和Java的导入方式很像。所以,如果你有很多模块(比如d.e.f1d.e.f2等),而这些模块又需要很多其他模块(比如a.b.c1a.b.c2等),那么你就得在每个模块里都写上需要的模块的导入语句,这样就会在你的代码文件中出现多次相同的import语句。看起来如果有一个更紧凑的导入模型(只需要导入一次同一个模块)会更好,但这样有一个很重要的缺点:紧凑的导入模型会使用全局命名空间,这样会让追踪依赖关系(比如,谁需要这段代码?这段代码来自哪里?)变得更加困难。因此,每当你写一行你认为不必要的导入语句时,请记住,这是你为可维护的代码付出的(小)代价。

3

导入模块 X 的模块的导入内容不会泄露到 X 的命名空间中(这其实是件好事——如果这样的话,就需要动态作用域或者像 C/C++ 那样的 #include,这两者几乎没有用,反而常常会带来麻烦)。每个模块都有自己完全独立的命名空间。如果你想在一个模块(比如 one)中使用某个东西(比如 pygame),就要在那个模块里进行导入。

撰写回答