2014-01-11 106 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