6

Python は初めてですが、第 2 レベルの継承について質問があります。

私はこの状況を持っています:

class A:
  def Something(self):
     #Do Stuff

class B(A):
  def SomethingElse(self):
     #Do other stuff

class C(B):
  def Something(self):
     #Do additional stuff

クラス C は A から継承する B から継承しますが、クラス B はメソッド Something() を実装しないことに注意してください。

クラス C のインスタンスに対して super(C, self).Something() を呼び出すとどうなりますか? クラス A からメソッドを呼び出しますか?

さらに、クラス BSomething() を実装しているが、クラス A の Something() をクラス C から直接呼び出したい (つまり、クラス B の実装をバイパスする) 場合、どうすればよいですか?

最後に、親クラスのメソッドを直接呼び出すのではなく、super() を使用する理由を説明してもらえますか? ありがとう。

4

2 に答える 2

11

B が を実装していない最初のケースではSomething、呼び出しsuperはそれが定義されている場所、つまりA.

2 番目のケースでは、 を呼び出して B をバイパスできますA.Something(self)

使用する主な理由superは、複数の継承がある場合です。Python は常に MRO (メソッド解決順序) の次の定義を呼び出します。

Raymond Hettinger の優れた記事を参照してください.

于 2013-06-24T13:03:34.823 に答える
5
  1. はい、クラスSomething()から呼び出します。A
  2. A.Something(self)からいつでも呼び出すことができますC

およびその他の呼び出し規約の説明にsuper()はしばらく時間がかかります。MROに関する元の記事を参照してください。Pythonの Super は気の利いたものですが、使用できません

于 2013-06-24T13:01:55.763 に答える