6

私は DiveIntoPython を調べていて、これに出くわしました:

Java と Powerbuilder は、引数リストによる関数のオーバーロードをサポートしています。つまり、1 つのクラスに、同じ名前で引数の数が異なる複数のメソッド、または異なる型の引数を指定できます。他の言語 (特に PL/SQL) は、引数名による関数のオーバーロードもサポートしています。つまり、1 つのクラスは、同じ名前で同じ型の同じ数の引数を持つ複数のメソッドを持つことができますが、引数名は異なります。Python はこれらのどちらもサポートしていません。関数のオーバーロードの形式はまったくありません。メソッドはその名前だけで定義され、指定された名前を持つクラスごとに 1 つのメソッドしか存在できません。したがって、子孫クラスに__init__メソッドがある場合、常に先祖をオーバーライドします__init__たとえ子孫が別の引数リストでそれを定義したとしても。そして、同じルールが他の方法にも適用されます。

__init__これは、サブクラスのメソッドが常にスーパークラスのメソッドをオーバーライドするという大きな欠点ではない__init__でしょうか? したがって、いくつかの変数を初期化し、クラスclass1のいくつかの関数を呼び出す場合__init__、そのサブクラスを派生させclass2(class1)ます。すべてclass1の変数を再初期化し、それらの関数をクラスで呼び出す必要がありますclass2__init__?

私はこれらすべてを誤解していると確信しているので、誰かがこれを明確にしてくれれば素晴らしいと思います.

4

2 に答える 2

14

サブクラスでの定義__init__がスーパークラスの をオーバーライドすることは正しいですが、サブクラスからスーパークラスのコンストラクターを呼び出すために__init__いつでも使用できます。super(CurrentClass, self).__init__したがって、スーパークラスの初期化作業を「手動で」複製する必要はありません。

補足として、Python はメソッドのオーバーロードをサポートしていませんが、デフォルトの引数を ( *argsandによるオプションの引数に加えて**kwargs) サポートしています。つまり、関数で異なる引数のサブセットを受け入れるだけで、オーバーロードされた関数の動作を簡単にエミュレートできます。 /メソッドの実装。

于 2012-12-21T11:32:19.900 に答える
2

したがって、いくつかの変数を初期化し、クラス class1's でいくつかの関数を呼び出す場合、__init__そのサブクラス class2(class1) を派生させます。class1 のすべての変数を再初期化して、それらの関数を class2's で呼び出す必要があり__init__ます

いいえ。スーパークラスの__init__(). ここここで、その方法を見つけることができます。

于 2012-12-21T11:41:17.780 に答える