从导入的脚本中使用Pygame模块
大家好!
我正在制作一个简单的贪吃蛇游戏。我想把我的类分开到不同的模块里,比如把菜单类放在一个单独的脚本中,而不是和我的主游戏循环放在一起。换句话说,我希望我导入的脚本能够使用在主脚本中之前已经调用的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 个回答
Python的导入模型是这样的:如果你在模块d.e.f
中需要使用模块a.b.c
,那么你需要在d/e/f.py
的开头加上一行import a.b.c
(或者类似的语句)。这和Java的导入方式很像。所以,如果你有很多模块(比如d.e.f1
、d.e.f2
等),而这些模块又需要很多其他模块(比如a.b.c1
、a.b.c2
等),那么你就得在每个模块里都写上需要的模块的导入语句,这样就会在你的代码文件中出现多次相同的import
语句。看起来如果有一个更紧凑的导入模型(只需要导入一次同一个模块)会更好,但这样有一个很重要的缺点:紧凑的导入模型会使用全局命名空间,这样会让追踪依赖关系(比如,谁需要这段代码?这段代码来自哪里?)变得更加困难。因此,每当你写一行你认为不必要的导入语句时,请记住,这是你为可维护的代码付出的(小)代价。
导入模块 X 的模块的导入内容不会泄露到 X 的命名空间中(这其实是件好事——如果这样的话,就需要动态作用域或者像 C/C++ 那样的 #include
,这两者几乎没有用,反而常常会带来麻烦)。每个模块都有自己完全独立的命名空间。如果你想在一个模块(比如 one
)中使用某个东西(比如 pygame
),就要在那个模块里进行导入。