Python 3动态分配基类

时间:2013-05-21 00:03:47

标签: python class python-3.x

我正在编写一个简单的国际象棋程序,在python 3中练习我的OOP,并想知道如何动态更改(在类创建之前)类定义的基类。我的班级结构是这样的。

  • 抽象片类 - >各种衍生作品
  • Board类,具有派生Pieces和8x8矩阵的复合,以及一些方法
  • 抽象接口类 - > CLI或
  • 抽象接口类 - > GUI(也是Tkinter的子类)
  • 游戏类(用于处理游戏逻辑和主循环),目前有一个Board类成员。

我最初将Game类实现为具有在 init 期间定义的接口数据成员,但我发现自己将许多其他内部Game数据发送给Interface组合成员。我认为让Game类成为Interface子类的子类会更优雅,因此它可以直接访问它们的方法(并使它们成为抽象的)。

但是我想要一个可以动态执行此操作的Game类的版本,这样我就不需要对它进行两次编码或从两者继承并在运行时决定使用哪个基类。我目前通过将Game类嵌套在一个像这样的函数中来完成这个。

def Game(ui):
    class Game(ui):
        ...
    return Game()

糟糕的命名是我不喜欢这个解决方案的部分原因。我希望能够自己调用Game类,而无需明确使用或承认我正在做任何与众不同的事情。

有没有办法用元类或类装饰器做到这一点?我只能让它们影响类属性,而不是父类。

2 个答案:

答案 0 :(得分:3)

class语句是

的“语法糖”
type(name, bases, dict)

您可以使用type这样的

创建这样的动态类
>>> class ui():
...     def start(self): print("Started!")
... 
>>> Game = type("Game", (ui,), {})
>>> game = Game()
>>> game.start()
Started!

答案 1 :(得分:3)

可以在这里使用一个非常简单的元类,但这太过分了。你可以根据你想要的条件换掉你正在使用哪个类作为基类:

>>> class Foo: pass
... 
>>> class Bar: pass
... 
>>> x = 3
>>> class Game(Foo if x < 3 else Bar):pass
... 
>>> Game.__bases__
(<class '__main__.Bar'>,)

请注意,这与你所拥有的形式主义并没有什么不同。但是,如果我要使用您的代码,我不会在函数中创建Game类和实例。我会做类似的事情:

def Game_Factory(base):
    class Game(base):
         ...
    return Game

Game1 = Game_Factory(base1)
Game2 = Game_Factory(base2)

game1_instance = Game1()
game2_instance = Game2()

这使您可以更轻松地访问Game类(而不需要检查实例以获取它)。