12

それとも、メソッドを呼び出したいスーパークラスを明示的に参照する必要がありますか?

コンストラクターを参照するときにスーパークラスの名前を繰り返すのは脆いようですが、このページhttp://fuhm.net/super-harmful/は super() の使用に対していくつかの良い議論をしています。

4

6 に答える 6

10

Expert Python Programmingという本は、第 3 章で「大きな落とし穴」について論じています。一読の価値があります。以下は本の結論です。

スーパーの使用は一貫している必要があります。クラス階層では、スーパーはどこでも使用するか、どこにも使用しないでください。スーパー コールとクラシック コールを混在させると、混乱を招きます。コードがより明示的であるため、人々は super を避ける傾向があります。

編集:今日、私は本のこの部分をもう一度読みました。スーパーの使い方は難しいので、さらにいくつかの文をコピーします。

  • コード内での多重継承は避けてください。
  • 使用方法に一貫性を持たせ、新しいスタイルと古いスタイルを混在させないでください。
  • サブクラスでメソッドを呼び出す前に、クラス階層を確認してください。
于 2009-08-11T10:59:23.483 に答える
6

super を使用できますが、記事にあるように欠点があります。それらを知っている限り、機能を使用するのに問題はありません。「継承ではなく構成を使用する」または「グローバル変数を使用しない」と言っているようなものです。機能が存在する場合は、理由があります。理由と内容を理解し、賢く使用してください。

于 2009-08-11T10:42:28.400 に答える
3

super()は、多重継承の問題を解決しようとします。そのセマンティクスを複製することは困難であり、完全に確信が持てない限り、新しいセマンティクスを作成するべきではありません。

単一継承の場合、実際には違いはありません

class X(Y):
    def func(self):
        Y.func(self)

class X(Y):
    def func(self):
        super().func()

だから、それは味の問題だと思います。

于 2009-08-11T17:05:40.207 に答える
3

すべてのメソッドで変更することなく、継承されたクラスを変更できるため (たとえば、リファクタリングして中間クラスを追加する場合)、super() の方が気に入っています。

于 2009-08-11T10:43:21.033 に答える
2

人々が抱えてsuperいる問題は、多重継承の問題です。だから責めるのは少し不当だsupersuper多重継承がなければ、さらに悪いことになります。Michele Simionato は、super に関する彼のブログ記事でこれをうまくまとめています。

一方で、すべてのスーパーワートが根本的な深刻な問題のヒントではないかどうか疑問に思うかもしれません. 問題はスーパーや協調的なメソッドにあるのではなく、多重継承自体に問題があるのか​​もしれません。

したがって、主な教訓は、多重継承を避けるようにする必要があるということです。

一貫性を保つために、私は常に super を使用します。単一継承の場合はそれほど重要ではありません (親クラス名を知る必要がないという小さな利点は別として)。Python 3+superではより便利なので、必ず super を使用する必要があります。

于 2009-08-11T12:05:56.047 に答える
0

はい、他の方法よりも使用する必要がありますsuper()。これは現在、Python 3 の標準オブジェクト継承モデルです。

メソッドのキーワード引数に固執するだけで、__init__それほど多くの問題は発生しないはずです。**kwargsさらに、継承チェーンのレベルで定義されていない追加のパラメーターをサポートするために使用できます。

私はそれが壊れやすいことに同意しますが、継承されたクラスの名前を使用するのと同じです。

于 2009-08-11T10:41:19.760 に答える