繁体   English   中英

如何将我的Python代码组织成多个类?

[英]How to organize my Python code into multiple classes?

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

例如,如果我有一个名为settings.py的脚本,其中定义了屏幕对象的大小,模拟的速度和各种对象的颜色,如果在我的engine.py脚本中需要这些变量,我该怎么办?和我的main.py脚本? 我在两个脚本中都导入了两次吗? 看起来相当混乱。 如果我的一些类在engine.py脚本中需要来自main.py代码main.py办?

让我告诉你具体情况......

我的main.py脚本本身导入Pygame,初始化它,依此类推。 它曾经有一个表示屏幕上对象的类,该类有一个方法draw ,它只是调用Pygame绘制函数。 现在,当我把这个类放在我的engine.py脚本中时,事情就不再起作用,因为Pygame在那里不存在! 我最后在engine.py导入了settings.py和Pygame,然后将引擎导入main.py ,但是它更像是初始化器而不是引擎......有没有办法处理这些事情,像一般指导线?

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

另请参阅StackOverflow这个问题: Python导入有哪些好的经验法则?

您可以从多个类中导入变量而不会出现问题,但您应该尝试构建代码,以便不循环导入内容。 Python中的循环导入依赖项

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

模型-视图-控制器

这里还有一些文档: http//www.wkoorts.com/wkblog/2007/12/23/mvc-design-patterns-with-python-links/

在这种情况下,进口似乎是合乎逻辑和必要的。 我想补充一点,就是你已经对你的3个文件做了大致的事情。

不是答案,但是:

settings.py应该是settings.ini ,你应该使用ConfigParser来阅读它。 读取配置文件一次,并在模块之间共享生成的ConfigParser.RawConfigParser

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

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

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

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

将模块导入多个其他模块并不麻烦。 它比具有数千行代码的模块更清晰

圆形进口确实存在问题。 但是你的情况听起来并不像循环导入问题。 你说“现在,当我把这个类放在我的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初始化一次,然后将其导入到您想要的任何位置。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM