背景: 我一直在用Python编写游戏,为了保持一切清洁,有条理和以pythonic方式,我有一个包含多个python文件的文件夹,每个文件包含一个大类,例如“MapEngine”或“NPCEngine”。
从main.py开始,我从每个文件中加载每个类,然后“将所有内容与”Game“类粘合在一起,例如:
from folder import *
class Game:
def __init__(self):
self.MapEngine = MapEngine.MapEngine()
...
def loop(self):
...
由于诸如“CollisionEngine”之类的类需要来自其他类的数据,例如“MapEngine”,我通常会将前者(即CollisionEngine)中的一些变量分配给后者(即MapEngine),以便使用MapEngine加载的地图数据或功能:
class CollisionEngine:
def __init__(self, MapClass, ...):
self.MapEngine = MapClass
问题: 好吧,因为许多类必须与其他类链接,所以一段时间后很难找出首先加载哪个类来分配变量。此外,像“EventEngine”这样的类需要访问其他所有类。我的代码变得难以阅读,当两个课程彼此同等重要时我会遇到麻烦。
问题: 我听说过类继承,但我不认为它可以在这里应用,因为每个类的功能都非常不同。因此,有没有办法将每个班级精美地联系在一起,好像它是一个大班的一部分?换句话说,有没有办法从类中引用其他类的变量?
(我的想法:也许,我可以编写一个名为“Request”的类,它将充当顶级类管理器。虽然,我认为我将不得不使用exec()或eval()等函数,哪些效率不高,有点危险。)
这是我的第一篇文章,我试图尽可能明确,请让我澄清一下,&谢谢你的回复!
答案 0 :(得分:1)
考虑将您的项目分成多个层次 - 这应该可以帮助您使事情更有条理,并使导入更自然。
原则是代码的较低层" cake"不应该依赖(读取:导入)代码的上层。
例如,您可能有一个基础层,其中包含在各个层的代码中使用的常见数据结构,实用程序类和算法。
然后你可能有一个模型层,它取决于基础层(即数据结构/工具/算法),但没有别的。模型层提供域内对象的模型。
然后你可能有一个依赖于模型层的游戏层(所以你的游戏层中的模块从模型层导入东西是合理的,但反之亦然)。
答案 1 :(得分:0)
好吧,经过多次尝试,我找到了解决问题的(粗略)方法。当然,正如eddiewould建议的那样,我将为我的代码提供更好的组织和多层,但如果想要将多个类全部链接在一起,只需将一个变量包含到主类(称为每个类)到每个类。我相信代码段会更好地解释它:
main.py
engine_folder
----> engine_1.py
----> engine_2.py
在main.py,engine_1和engine_2中加载:
from engine_folder import engine_1, engine_2
class game:
def __init__(self):
self.engine_1 = engine_1.engine(self, ...)
self.engine_2 = engine_2.engine(self, ...)
#where engine_1.engine and engine_2.engine are
#two classes that need to transfer data between
#each other
def run(self):
self.engine_1.run()
self.engine_2.run()
注意engine_1.engine的第一个参数是self,它指的是调用此类的顶级类。现在,在engine_1中,如果我们想要从engine_2打印变量,该类看起来与此类似:
class engine:
def __init__(self, top_level_class, ...):
self.top_level_class = top_level_class
def run(self):
print self.top_level_class.engine_2.random_var
这非常漂亮(除了打印self.top_level_class.engine_2.random_var非常长的事实),但与以下内容相比:
class EventEngine:
def __init__(self, Camera_Class, Map_Class, Character_Class, Skill_Class,
Interface_Class, Sprite_Class, Dialog_Class, Game_Class,
Item_Class):
self.ItemEngine = Item_Class
self.GameEngine = Game_Class
self.DialogEngine = Dialog_Class
self.SpriteEngine = Sprite_Class
self.SkillEngine = Skill_Class
self.CameraEngine = Camera_Class
self.MapEngine = Map_Class
self.CharacterEngine = Character_Class
self.IEngine = Interface_Class
新版本:
class EventEngine:
def __init__(self, top_level_class):
self.top = top_level_class
#a var from Map_Class can be called as such:
#self.top.MapEngine.map[0][1]
#and I can call variables from every class, not only those I
#have loaded like before
更好更干净。