6

最近有人告诉我,我应该将代码保存在单独的文件中;像main.py, engine.py,settings.py等等。虽然这确实有好处,比如更容易管理、可扩展性等,但对我来说,它似乎有太多缺点......

例如,如果我有一个名为 的脚本,其中定义了屏幕对象的大小、模拟速度和各种对象的颜色等内容,如果我的脚本和脚本settings.py都需要这些变量,我该怎么办?我是否在两个脚本中都导入了两次?看起来比较乱。如果脚本中的某些类需要来自 的代码怎么办?engine.pymain.pyengine.pymain.py

让我告诉你确切的情况......

我的main.py脚本自己导入 Pygame,初始化它,等等。它曾经有一个代表屏幕对象的类,并且该类有一个方法draw,它只是调用 Pygame 绘图函数。现在,当我将类放入我的engine.py脚本中时,事情不再起作用,因为 Pygame 不存在!我最终在 中导入了settings.pyPygame 和 Pygame engine.py,然后将引擎导入到main.py中,但它更像是一个初始化程序而不是引擎......有没有办法处理这样的事情,比如一般指导方针?

4

6 回答 6

3

以下是官方 PEP 进口指南:http: //www.python.org/dev/peps/pep-0008/#imports

另请参阅这个 StackOverflow 问题:Python 导入的好的经验法则是什么?

您可以毫无问题地从多个类中导入变量,但您应该尝试构建代码,以免循环导入。Python中的循环导入依赖

于 2012-05-08T13:23:46.097 回答
1

你应该看看这个模型,它可能有助于你理解事物。我认为这是最适合您想做的事情

模型-视图-控制器

更多文档: http ://www.wkoorts.com/wkblog/2007/12/23/mvc-design-patterns-with-python-links/

在这种情况下,导入看起来应该是相当合乎逻辑和必要的。我要补充一点,这大致就是您对 3 个文件所做的事情。

于 2012-05-08T13:22:03.340 回答
1

将一个模块导入多个其他模块并不麻烦。它比具有数千行代码的模块要干净得多。

循环进口确实存在问题。但是您的情况听起来不像是循环导入问题。你说“现在,当我将类放在我的 engine.py 脚本中时,事情不再起作用,因为那里不存在 Pygame!我最终在 engine.py 中导入了 settings.py 和 Pygame,然后导入引擎进入 main.py”。

为什么你不能把类放进去engine.py,然后再把它导入main.py?一种非常简单的方法是将回调传递给您的类:

# engine.py
...
class ClassWithDraw(Subclass):
    def __init__(self, draw_callback):
        ...
        self._draw_func = draw_callback
        ...
    def draw(self):
        self._draw_func()

# main.py

from engine import ClassWithDraw
drawer = ClassWithDraw(drawfunc)

这种方法的好处是对象实际上只负责一件事:它自己的状态。draw事实上,这个对象根本没有方法可能更有意义。或者它可以draw_hook在必要时调用它以从中获取可绘制数据,并且另一个外部绘图函数可以调用它。

另一种方法是为 Pygame 提供一个完全独立的模块。我对 Pygame 了解不多,所以这可能行不通,但假设您有一个处理 Pygame 初始化和状态的模块。您可以在 中初始化它一次,main然后将其导入到任何您想要的位置。

于 2012-05-08T13:47:59.730 回答
1

它在其他语言中的常见做法(尤其是 Java,实际上是由编译器强制执行的)每个类都有一个文件。

至于您提到的文件间依赖关系,您应该考虑避免使用全局变量。

这是另一个相关问题,可以更好地回答您的问题。

我应该在一个文件中放入多少个 Python 类?

于 2012-05-08T13:25:19.563 回答
0

不是答案,而是:

settings.py应该是真的settings.ini,你应该用ConfigParser. 读取一次配置文件并ConfigParser.RawConfigParser在模块之间共享结果。

于 2012-05-08T13:24:04.743 回答
0

您可以在需要的任何模块中从 settings.py 导入符号。就是这个概念。一个实际的问题是当你有循环导入时。例如,如果您在里面有一些engine.py需要的符号怎么办,main.py反之亦然。在这种情况下,一种常见的模式是在第三个模块中打破这些依赖关系,main.py并且engine.py可以从中导入,没有任何问题。

于 2012-05-08T13:28:05.850 回答