5

以下に示すように、3つのクラスA、B、およびDがあります

class A(object):
    def test(self):
        print "called A"

class B(object):
    def test(self):
        print "called B"

class D(A,B):
    def test(self):
        super(A,self).test()

inst_d=D()
inst_d.test()

----------------------------------------
Output:
  called B

質問:D.test()で、 に電話してsuper(A,self).test()います。B.test()メソッドA.test()も存在するのに、なぜ呼び出されるだけですか?

4

3 に答える 3

6

あなたがそうしないように言ったからです。AのD.testのテスト メソッドを呼び出すように指示しましたが、それが実行されます。super

通常、super呼び出しでは現在のクラス名を使用します。

于 2012-07-18T18:15:46.000 に答える
0

super(A,self).test()手段: A inのメソッド解決順序 (mro) のtest後に、オブジェクトのメソッドを呼び出します。self

を使用D.__mro__すると、メソッド解決の順序は次のようになります。

<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'>

だからtestオブBと呼ばれます。

Python 3 では、入力するだけsuper().test()で、必要なことが実行されます。Python 2 では、次のように入力する必要があります。super(D,self).test()

于 2012-07-18T18:57:17.020 に答える
0

通常、super は現在のクラス名で呼び出され、Python の MRO が従うアルゴリズムに従ってどの親クラスを呼び出すかを処理します。したがって、意図した動作に対して、コードは次のようになります。

class D(A,B):
    def test(self):
        super(D,self).test()

ノートsuper(D,self).test()

于 2012-07-18T19:09:09.993 に答える