[英]How to organize my Python code into multiple classes?
我最近被告知我应该将我的代码保存在单独的文件中; 像main.py
, engine.py
, settings.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,其实际上是由编译器强制执行)每个类都有一个文件。
至于你提到的文件间依赖关系,你应该考虑避免全局变量。
这是另一个相关问题,可以更好地回答您的问题。
将模块导入多个其他模块并不麻烦。 它比具有数千行代码的模块更清晰 。
圆形进口确实存在问题。 但是你的情况听起来并不像循环导入问题。 你说“现在,当我把这个类放在我的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.py
和engine.py
可以从中导入,没有任何问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.