2016-04-26 16 views
2

拡張したいモジュールにクラス階層があります。Pythonでクラス階層を拡張する

拡張するモジュールは、次のようになります。 モジュールFOO:今、私は、これらのクラス拡張したい

class bar(object): pass 
class spam(bar): pass 
class eggs(bar): pass 

class my_bar(foo.bar): 
    def new_func(): pass 
class my_spam(foo.spam): pass 
class my_eggs(foo.eggs): pass 

はそうし、my_barの新機能new_funcは()

my_spam_instance.new_func() 
を使用してmy_spamインスタンスでは利用できないでしょう

これを達成するための最善の方法は何ですか?私はこのように、多重継承を考えた:

class my_bar(foo.bar): pass 
class my_spam(foo.bar, my_bar): pass 
class my_eggs(foo.eggs, my_bar): pass 

私は本当に前にそれを使ったことがないと私はこれが最善の方法であることを確認していないけど。

+0

あなたが書いたものはうまくいくはずですが、 "ダイヤモンドの関係"(my_spamはfoo.barとmy_barを継承しています。両方ともbarから継承しています)は理解しづらいことがあります。 my_barがfoo.bar(mixin)から継承されないようにすることができます。あなたが拡張したいクラスにいくつかの文脈を与えることができますか? – syntonym

+0

あなたがここに提示した詳細に基づいて、多重継承(MI)はあなたのためにうまくいくはずです。 – thebjorn

答えて

0

あなたもmy_bar

barからニシキヘビが実際に基底クラスでミックスインを追加することが、

class NewFuncMixin(): 
    def new_func(): pass 

を受け継ぎ、新しいクラスに追加しないことになる継承する必要はありません。

class my_bar(foo.bar, NewFuncMixin): pass 
class my_spam(foo.spam, NewFuncMixin): pass 
class my_eggs(foo.eggs, NewFuncMixin): pass 
+0

これはかなり良いですね。しかし、foo.spamの__init__メソッドとmy_spam .__ init __()のNewFuncMixinメソッドの両方をどのように呼び出すのですか?そのためにsuper()を使うことができますか?それとも明示的に呼び出す必要がありますか(foo.spam .__ init __()やNewFuncMixin .__ init __()など)? – Credics

+0

派生クラスにそれがなければ、最初のベース '__init__'だけが自動的に呼び出されます。したがって、基本的に派生 '__init__'で明示的に呼び出すことができます: ' '' NewFuncMixin .__ init __(self、* args、** kwargs) '' ' – aershov

0

mixinクラスはどうですか?パターンは

class My_mixin(object): 
    def new_func(self): pass 

class My_spam(My_mixin, foo.spam): pass 
class My_eggs(My_mixin, foo.eggs): pass 

ミックスインは、オブジェクトから継承し、ミックスインクラスメソッドは、名前の優先順位を取得するように、継承リストの左側に行くべきです。あなたはもちろん、それを完全に包むのではなく、メソッドをオーバーライドすることができ

class My_mixin(object): 

    def bar_method(self): 
     # stuff 
     bar_result = super(My_mixin, self).bar_method() 
     # more stuff 
     return bar_result # or my_result based on bar_result 

:ミックスイン内では、その後、スーパークラスのいずれかの方法をラップすることができます。

関連する問題