2011-06-09 17 views
6

私はクラスがあります。またミックスイン、マルチ継承、コンストラクタ、およびデータは

class A(object): 
    def __init__(self, *args): 
     # impl 

を「ミックスイン」、いくつかのデータとメソッドを持つ基本的に別のクラス:今、私が作成

class Mixin(object): 
    def __init__(self): 
     self.data = [] 

    def a_method(self): 
     # do something 

mixinのAのサブクラス:

class AWithMixin(A, Mixin): 
    pass 

私の問題は、AとMixinの両方のコンストラクタを呼び出すことです。私はAWithMixinにそれ自身のコンストラクタを与えることを考えました。そこではスーパーが呼び出されましたが、スーパークラスのコンストラクタは異なる引数リストを持っています。最高の解像度は何ですか?

+1

2つの基本クラスのコンストラクタを呼び出すのを止めるにはguments)を 'AWithMixin .__ init__'から削除しますか? – NPE

+0

これはすでに深い回答があります。最高のソリューションであるhttp://stackoverflow.com/a/6100595/763269 –

答えて

8

私はあまりにもOOPがかなり新しいんだけど、このコードの問題は何である:

class AWithMixin(A, Mixin): 
    def __init__(self, *args): 
     A.__init__(self, *args) 
     Mixin.__init__(self) 
+2

を参照してください。私はいつもそれを使用しています。しかし、 'A'と' Mixin'の両方が何らかのクラス(例えば 'Base')を拡張し、両方が' 'Base .__ init __()'を呼び出すなら、[super()関数](http:// stackoverflow。 com/q/576169)。それは複雑なIMHOです、私は知っていることをお勧めしますが、可能ならば避けてください。 – brandizzi

+0

@brandizzi、私が答えて言ったように、私はOOPを初めて利用しています。私は超機能を見たが、理解できなかった。私がこのクラス[code] super(AW​​ithMixin、self).__ init __()[/ code]について述べたのであれば、どのようにしてA .__ init__とMixin .__ init__を呼び出すことができますか?異なる引数を指定しますか? – utdemir

+1

問題は、この解決策は特に拡張可能ではなく、カプセル化のポイントを完全に無視し、ミックスインを間違った順序で指定することです。ミックスインのメソッドをオーバーライドしたい場合、そのミックスインはそのメソッドを制御し、スーパークラスで同じメソッドを呼び出す必要があります。ミックスインが別の引数リストを取っているということは、それが誤ってコード化されているか、この子クラスで使用するようには設計されていないことを示唆しています - それは[LSP](http://en.wikipedia.org/wiki/Liskov_substitution_principle) 。 – quodlibetor

10
class A_1(object): 
    def __init__(self, *args, **kwargs): 
     print 'A_1 constructor' 
     super(A_1, self).__init__(*args, **kwargs) 

class A_2(object): 
    def __init__(self, *args, **kwargs): 
     print 'A_2 constructor' 
     super(A_2, self).__init__(*args, **kwargs) 

class B(A_1, A_2): 
    def __init__(self, *args, **kwargs): 
     super(B, self).__init__(*args, **kwargs) 
     print 'B constructor' 

def main(): 
    b = B() 
    return 0 

if __name__ == '__main__': 
    main() 
  1. A_1コンストラクタ
  2. A_2コンストラクタ
  3. Bのコンストラクタ
関連する問題