それはちょうどそれを試してみるのと同じくらい簡単です:
今
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()
です。
あなたは 'super'を使うことができます。実際には、まさにそのためのものです。 – kindall
質問を編集しました。どうぞご覧ください。 – javanewbie
この質問はすでに回答済みです(http://stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple-inheritance)あなたはMROが何であるかを理解する必要があります。子クラスのMROツリーは 'ChildClass .__ mro__'で見つけることができます。スーパーファンクションは、クラスバインドされたプロキシとインスタンスバインドされたプロキシで動作します。 – Eddie