如何有效地将多个类链接在一起

时间:2014-05-13 05:28:25

标签: python class

背景: 我一直在用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()等函数,哪些效率不高,有点危险。)

这是我的第一篇文章,我试图尽可能明确,请让我澄清一下,&谢谢你的回复!

2 个答案:

答案 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

更好更干净。