2016-12-25 8 views
0

How does Python's super() work with multiple inheritance?で説明したように、superは両方の親で属性を検索するため、複数の継承でも使用できます。しかし、どのような属性ですか?サブクラスにはすでにsuperが含まれています(下記のコードを参照してください)。私が望む属性をどのように指定するのですか? Errorのコンストラクタが必要です。Python - ベースクラスのコンストラクタがオーバーライドされました

class Error(object): 
    def __init__(self, values): 
     self.values = values 

class AddDialog(sized_controls.SizedDialog, Error): 
    def __init__(self, *args, **kwargs): 
     Error.__init__(self, *args) 
     super(AddDialog, self).__init__(*args, **kwargs) 
+0

あなたは 'super'を使うことができます。実際には、まさにそのためのものです。 – kindall

+0

質問を編集しました。どうぞご覧ください。 – javanewbie

+0

この質問はすでに回答済みです(http://stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple-inheritance)あなたはMROが何であるかを理解する必要があります。子クラスのMROツリーは 'ChildClass .__ mro__'で見つけることができます。スーパーファンクションは、クラスバインドされたプロキシとインスタンスバインドされたプロキシで動作します。 – Eddie

答えて

1

それはちょうどそれを試してみるのと同じくらい簡単です:

class Error(object): 
    def __init__(self, values): 
     self.values = values 
     print('Error') 

class SizedDialog(object): 
    def __init__(self, values): 
     self.values = values 
     print('SizedDialog') 

class AddDialog(SizedDialog, Error): 
    def __init__(self, *args, **kwargs): 
     print('AddDialog') 
     Error.__init__(self, *args) 
     super(AddDialog, self).__init__(*args, **kwargs) 

super()は何もなく、あなたがmro()を得ることができる方法解決順序(MRO)に沿って行くのではありません:

>>> AddDialog.mro() 
[__main__.AddDialog, __main__.SizedDialog, __main__.Error, object] 

__init__()Errorと明示してください。この場合、は、がSizedDialogであることがMROのErrorよりも前になるためです。

>>> a = AddDialog(10) 
AddDialog 
Error 
SizedDialog 

あなただけsuper()Error__init__()に無コール)を使用する場合は、SizedDialogのだけ__init__()を取得する:あなたが唯一のError__init__()を呼び出す場合

class AddDialog(SizedDialog, Error): 
    def __init__(self, *args, **kwargs): 
     print('AddDialog') 
     super(AddDialog, self).__init__(*args, **kwargs) 

>>> a = AddDialog(10) 
AddDialog 
SizedDialog 

は最後に、それはあります呼び出されるのは__init__()のみです。

class AddDialog(SizedDialog, Error): 
    def __init__(self, *args, **kwargs): 
     print('AddDialog') 
     Error.__init__(self, *args) 

>>> a = AddDialog(10) 
AddDialog 
Error 

だからあなたの質問:

しかし、どのような属性?あなたが呼び出す

1:

は答えを持っています。

それはあなたのハードワイヤークラスならばErrorで行ったように、重要で、またはsuper()は、すなわち、MROの次の1適切な親クラスを見つけることはできません。 唯一の違いは、親クラスに__init__()がない場合、super()が祖父母クラスの__init__()を呼び出す可能性があります。 しかし、これは意図された動作ですsuper()です。

+0

これはあなたの質問に答えますか? –

関連する問題