2014-01-11 4 views
15

はどのように私は動的にこのような何かに基づいてParentAまたはParentBのいずれかからいくつかの第三クラスの継承をさせることができ、私はクラスダイナミック継承は、

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つの異なる実装を持って言いますか?

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

:もちろん、あなたが同じようtype()呼び出しでこれらの値を構築することができ、BASE_CLASS、またsubclass_body_dictを保存するために持っていけません基本クラスが異なる*クラスを作成することです。 – 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。私は質問はDUPの作成後、インスタンスのクラスを変更し、この問題についてだったbecausedリニューアルオープン

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

Filip、 'type()'を使うと、親は第3引数で与えられたメソッドしか持たないでしょう。どのようにしてそのメソッドを保持し、第3引数で与えられたメソッドをオーバーライドするか? – Morten

+0

私はそれを理解しました。タプルに子クラスを追加するだけです。 – Morten