super().__init__(*args, **kwargs)
「自己」に合格しないと認識します。自動的に挿入されます。
super()
は、最初のクラスは、そのすぐ上のスーパークラスが変更される可能性があることのようにクラス階層におけるミックスインとして再利用できるようにするためのPython 2に設計されました:時間の中でいくつかの点で
レッツ・suposeあなたのコードは次のようである:
この時点で
class A: pass
class B(A):
def __init__(self, *args, **kwargs):
...
# Fixed call to A
A.__init__(self, *args, **kwargs)
class C(A):
def __init__(self, *args, **kwargs):
...
# Fixed call to A
A.__init__(self, *args, **kwargs)
class D(C, B):
pass
、正しいOOPコードがB.__init__
への呼び出しをチェーンする必要がありC.__init__
を実行する必要がありますが、スーパークラス名が起こらないようにハードコードされた - A
の__init__
は常に次来ます。 B.__init__
をC
にハードコードすると、がB
なしで機能しないようになり、複数の継承の目的を破ることになります。
あなたの代わりにsuper()
を使用する場合は、Pythonのクラスの__mro__
属性に見て次の親クラスのメソッドを検索し(MRO =メソッド解決順序。__mro__
は各Pythonクラスに添付具体的な属性である)を行います。 - したがって、上記の時差クラスD
のある時点で、B
から継承されなくなった場合、super().__init__
への呼び出しはC
に自動的にA
に自動的に再ルーティングされます。
というパラメータのない形式は、その使用を容易にするために導入されました。その前に、独自のクラスへの参照をハードコードし、パラメータにself
を挿入する必要がありました。このフォームは、コンパイラ自体にハードコードされているPythonのほんの一部の例外の1つです。super
(または__class__
)がメソッド本体の中にある場合(つまり、クラス自体を指す変数__class__
が作成されたときsuper
コールが使用する)
'super()'は、** MRO ** ... –
を使用してコールを解決します。サブクラスが複数のスーパークラスを持つ場合、またはある時点で継承するサブクラスを変更する場合は、別のスーパークラス。 Btw、 "親クラス"は、継承のための通常の用語ではありません。 – khelwood
@khelwood厳密に言えば、そうではありません。複数の継承を持つクラスをサブクラス化すると、 'super()'は実際には親ではなくslibingに委譲できます。単に '__mro__'の次の行を返します。 –