我正在编写一个简单的国际象棋程序,在python 3中练习我的OOP,并想知道如何动态更改(在类创建之前)类定义的基类。我的班级结构是这样的。
我最初将Game类实现为具有在 init 期间定义的接口数据成员,但我发现自己将许多其他内部Game数据发送给Interface组合成员。我认为让Game类成为Interface子类的子类会更优雅,因此它可以直接访问它们的方法(并使它们成为抽象的)。
但是我想要一个可以动态执行此操作的Game类的版本,这样我就不需要对它进行两次编码或从两者继承并在运行时决定使用哪个基类。我目前通过将Game类嵌套在一个像这样的函数中来完成这个。
def Game(ui):
class Game(ui):
...
return Game()
糟糕的命名是我不喜欢这个解决方案的部分原因。我希望能够自己调用Game类,而无需明确使用或承认我正在做任何与众不同的事情。
有没有办法用元类或类装饰器做到这一点?我只能让它们影响类属性,而不是父类。
答案 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
类(而不需要检查实例以获取它)。