ホームページ  >  記事  >  バックエンド開発  >  Python クラスの super() と __init__() の違い

Python クラスの super() と __init__() の違い

WBOY
WBOYオリジナル
2016-12-05 13:27:141343ブラウズ

単一継承では、super() と __init__() によって実装される関数は似ています

リーリー

出力結果:

リーリー

違いは、super() 継承を使用するときに基本クラスを明示的に参照する必要がないことです。

super() は新しいスタイルのクラスでのみ使用できます

基底クラスを古いスタイルのクラスに変更します。つまり、基底クラスを継承しません

リーリー

実行すると、bの初期化時にエラーが報告されます:

リーリー

super は親クラスではなく、継承シーケンスの次のクラスです

多重継承の場合、次の関数と同様に、super() は継承順序で親クラスではなく次のクラスを返すことと同等です。

リーリー
mro() はクラスの継承順序を取得するために使用されます。

例:

リーリー
出力結果は以下の通りです:

リーリー
supder は親クラスに関連していないため、実行順序は A —> B—>—> Base

実行プロセスは以下と同等です: childC() を初期化するとき、最初に super(childA, self) を呼び出します。childA のコンストラクターで __init__() は、継承順序で childA の後のものを返します。現在のクラス childB; 次に childB().__init()__ を実行し、この順序で続行します。

多重継承において、childA()のsuper(childA, self).__init__()をBase.__init__(self)に置き換えると、実行時、childAを継承した後、省略されたBaseクラスに直接ジャンプします。子供B:

リーリー
super() メソッドから分かるように、super() の最初のパラメータは継承チェーン内の任意のクラスの名前にすることができます。

それ自体の場合は、次のクラスを順番に継承します。

それが継承チェーン内の前のクラスの場合、無限に再帰されます

それが継承チェーンの後のクラスである場合、継承チェーンの概要自体と受信クラスの間のクラスは無視されます。

たとえば、childA() の super を super(childC, self).init() に変更すると、プログラムは無限に再帰的に実行されます。

例:

リーリー

super() は繰り返しの呼び出しを避けることができます

childA が Base に基づいている場合、childB は childA と Base を継承し、childB が Base の __init__() メソッドを呼び出す必要がある場合、__init__() が 2 回実行されます。

リーリー

Baseの __init__() メソッドが2回実行されます
リーリー

繰り返しの呼び出しを避けるには super() を使用してください
リーリー

上記は編集者が紹介した Python クラスの super() と __init__() の違いです。ご質問があればメッセージを残してください。編集者が返信します。間に合うようにあなたに。スクリプト ハウス Web サイトをサポートしてくださった皆様にも感謝いたします。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。