[解決済み] Pythonのsuper()は多重継承でどう動くのか?
質問
私はPythonのオブジェクト指向プログラミングの初心者なのですが、以下のような問題があります。
を理解することができます。
super()
関数 (新スタイルのクラス)、特に多重継承に関して。
例えばこんなのがあったら。
class First(object):
def __init__(self):
print "first"
class Second(object):
def __init__(self):
print "second"
class Third(First, Second):
def __init__(self):
super(Third, self).__init__()
print "that's it"
よくわからないのは
Third()
クラスは両方のコンストラクタ・メソッドを継承していますか?もしそうなら、どちらのメソッドが
super()
そしてその理由は?
また、もう一方を実行したい場合はどうすればいいのでしょうか?Pythonのメソッド解決順序に関係するのはわかるけど( MRO ).
解決方法は?
これについては、グイドー自身がブログの記事でそれなりに詳しく説明しています。 メソッド解決順序 (以前の2つの試みも含む)。
あなたの例では
Third()
が呼び出されます。
First.__init__
. Pythonは、クラスの親が左から右にリストアップされるように、各属性を探します。この場合、私たちが探しているのは
__init__
. ですから、もしあなたが
class Third(First, Second):
...
Python は、まず
First
で、もし
First
がその属性を持っていない場合、その属性は
Second
.
この状況は、継承がパスと交差し始めると、より複雑になります。
First
から継承された
Second
). 詳しくは上のリンクを読んでいただきたいのですが、簡単に言うと、Pythonは各クラスが継承リスト上に現れる順番を、子クラス自身から順番に維持しようとします。
だから、例えば、あなたが持っていた場合。
class First(object):
def __init__(self):
print "first"
class Second(First):
def __init__(self):
print "second"
class Third(First):
def __init__(self):
print "third"
class Fourth(Second, Third):
def __init__(self):
super(Fourth, self).__init__()
print "that's it"
MROは
[Fourth, Second, Third, First].
ところで、Pythonは一貫したメソッド解決順序を見つけることができない場合、ユーザーを驚かせるかもしれない動作に陥るのではなく、例外を発生させます。
あいまいなMROの例。
class First(object):
def __init__(self):
print "first"
class Second(First):
def __init__(self):
print "second"
class Third(First, Second):
def __init__(self):
print "third"
すべき
Third
のMROは
[First, Second]
または
[Second, First]
? 明らかな期待値はなく、Pythonはエラーを発生させます。
TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution order (MRO) for bases Second, First
上記の例では、なぜ
super()
を呼び出すことができますか?この例のポイントは、MROがどのように構成されるかを示すことです。それは
ではなく
を印刷するためのものです。
"first\nsecond\third"
といった具合です。もちろん、この例で遊んでみることもできますし、そうすべきです。
super()
を呼び出し、何が起こるかを見て、Pythonの継承モデルについてより深く理解することができます。しかし、ここでの私の目標は、シンプルにして、MROがどのように構築されているかを示すことです。そしてそれは、私が説明したとおりに構築されています。
>>> Fourth.__mro__
(<class '__main__.Fourth'>,
<class '__main__.Second'>, <class '__main__.Third'>,
<class '__main__.First'>,
<type 'object'>)
関連
-
Pythonショートビデオクローラーチュートリアル
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み] 'int'オブジェクトに'__getitem__'属性がない。
-
[解決済み] Pythonのeasy_installでインストールしたパッケージはどのように削除すればよいですか?
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?
-
[解決済み] collections.defaultdictはどのように機能するのですか?
-
[解決済み] Pythonで'super'は何をするのですか?- super().__init__() と明示的なスーパークラス __init__() の違い
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
Python interpreted model libraryによる機械学習モデル出力の可視化 Shap
-
Evidentlyを用いたPythonデータマイニングによる機械学習モデルダッシュボードの作成
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
風力制御におけるKS原理を深く理解するためのpythonアルゴリズム
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み] データ型が理解できない
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み】NameError: 名前 'self' が定義されていません。