2014-01-11 75 views
15

说我有一类动态继承

class ParentA: 
    def initialize(self): 
     pass 

    def some_event(self): 
     pass 

    def order(self, value): 
     # handle order in some way for Parent A 


class ParentB: 
    def initialize(self): 
     pass 

    def some_event(self): 
     pass 

    def order(self, value): 
     # handle order in another for Parent B 

的2层不同的实现如何动态让无论从ParentAParentB一些第三类继承基于这样的事?

class MyCode: 
    def initialize(self): 
     self.initial_value = 1 

    def some_event(self): 
     # handle event 
     order(self.initial_value) 


# let MyCode inherit from ParentA and run 
run(my_code, ParentA) 
+0

我重新打开的问题becaused的DUP约为创建后改变类的实例,而这个问题是关于用不同的基类创建*类*的。 – shx2

回答

34

简单地存储在一个变量的类对象(在下面的例子中,它被命名为base),并在class声明的基类,规范使用变量。

def get_my_code(base): 

    class MyCode(base): 
     def initialize(self): 
      ... 

    return MyCode 

my_code = get_my_code(ParentA) 
4

此外,您可以使用type内置。作为可调用的,它需要参数:name, bases, dct(以其最简单的形式)。

def initialize(self): 
    self.initial_value = 1 

def some_event(self): 
    # handle event 
    order(self.initial_value) 

subclass_body_dict = { 
    "initialize": initialize, 
    "some_event": some_event 
} 

base_class = ParentA # or ParentB, as you wish 

MyCode = type("MyCode", (base_class,), subclass_body_dict) 

这比snx2解决方案更明确,但仍然 - 我喜欢他的方式更好。

PS。当然,你不必存储BASE_CLASS,也不subclass_body_dict,你可以像在type()呼叫建立这些值:

MyCode = type("MyCode", (ParentA,), { 
     "initialize": initialize, 
     "some_event": some_event 
    }) 
+0

Filip,当我使用type()时,父类将只有第三个参数中给出的方法。任何方法来保持它的方法,并只覆盖第三个参数中给出的方法? – Morten

+0

好吧,我想通了。只需将子类添加到元组中即可。 – Morten