アノンの答えでは: 「現在のクラスで行われていることに加えて
、スーパーから何かを行う必要がある場合は、それを自分で呼び出す必要があります。これは自動的に行われないためです」__init__
__init__
信じられないことです。彼は、継承の原則とは正反対のことを言っています。
「スーパーの__init__
(...)からの何かが自動的に起こらない」ということではなく、自動的に起こるということですが、基本クラス__init__
が派生クラスの定義によってオーバーライドされるため、起こりません。__init__
それでは、なぜ派生クラスを定義するの__init__
でしょうか?
これは、基本クラスでは実行されない何かを定義する必要があり、それを取得する唯一の可能性は、その実行を派生クラスの関数__init__
に入れることだからです。
言い換えれば、ベースクラスがオーバーライドされていない場合にベースクラスで自動的に行われるものに加えて、ベースクラスで何かが必要です。
その逆ではありません。 __init__
__init__
__init__
次に、問題は、基本クラスに存在する目的の命令__init__
がインスタンス化の時点でアクティブ化されないことです。この非アクティブ化を相殺するには、何か特別なことが必要です: base-class'によって実行される初期化を追加せずにKEEP__init__
するために、base-class' を明示的に呼び出します。それはまさに公式ドキュメントで言われていることです:__init__
派生クラスのオーバーライド メソッドは、同じ名前の基本クラス メソッドを単純に置き換えるのではなく、実際には拡張する必要がある場合があります。基本クラス メソッドを直接呼び出す簡単な方法があります。単に BaseClassName.methodname(self, arguments) を呼び出すだけです。
http://docs.python.org/tutorial/classes.html#inheritance
それがすべての話です:
目的が基本クラスによって実行される初期化を維持すること、つまり純粋な継承である場合、特別なことは何も必要ありません__init__
。派生クラスで関数を定義することを避ける必要があります
目的が基本クラスによって実行される初期化を置き換えることである場合__init__
、派生クラスで定義する必要があります
基本クラスによって実行される初期化にプロセスを追加することが目的の場合、基本クラス__init__
への明示的な呼び出しを含む派生クラスを定義する必要があります。__init__
Anon の投稿で私が驚くべきことは、彼が継承理論の反対を表明したことだけではなく、5 人の男が髪を向けることなく賛成票を投じて通りかかったことであり、さらに 2 年間で誰も反応しませんでした。興味深いテーマを比較的頻繁に読まなければならないスレッド。