組み込み型から、そして他のいくつかのクラスから派生するとき、組み込み型のコンストラクタはスーパークラスコンストラクタを呼び出さないようです。この結果、__init__メソッドは、MROの組み込み関数の後ろにある型に対して呼び出されません。Python 3の組み込み型__init__は、super().__ init__を呼び出しません。
例:このサンプルで
class A:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
print("A().__init__()")
class B(list, A):
def __init__(self, *args, **kwargs):
print("B().__init__() start")
super().__init__(*args, **kwargs)
print("B().__init__() end")
if __name__ == '__main__':
b = B()
は、A .__ init__が呼び出されることはありません。 Bがclass B(A, list)
と定義されている場合(継承順序を切り替える)、意図したとおりに動作します(つまり、A .__ init__が呼び出されます)。
この非常に微妙な継承の依存関係は、むしろ非平凡なように見えますが、これはこのように意図されていますか?また、他の誰かがあなたのクラスから派生したとき(メンテナンスホラー)に、組み込み関数がどこでMROに終わるのかを知ることができないので、複雑なクラス階層の組み込み型から決して派生してはいけません。何か不足していますか?
追加情報:Pythonのバージョン3.1
Pythonのそれはとinit__' 'A .__呼ぶもの__init__'方法 – Marcin
'スーパークラスの自動呼び出しがありませんでしたか? 'list .__ init__'は1つの引数を取り、それ以上取得したらエラーを投げます。他の議論を受け入れたとしても、それは最初のものを駄目にするので、A sawは相続命令に依存するでしょう。 –
同様の質問:http:// stackoverflow。com/questions/3277367/how-does-pythons-super-work-with-multiple-inheritance Guidoがその質問の答えから抜け出すのは:http://python-history.blogspot.com/2010/06/method- resolution-order.html – aganders3