2

編集:私の仮定は間違っていました。以下のコードは、実際には私が望んでいたように機能します。私が観察していた動作は、完全に無関係に見えたために見落としていた、作業中のコードの別のビットが原因であることが判明しました。

だから私はこのように構造化されたいくつかのコードを持っています:

class B(object):
    def foo(self):
        print "spam"

    def bar(self):
        do_something()
        self.foo()
        do_something_else()

class C(B):
    def foo(self):
        print "ham"

    def bar(self):
        super(C, self).bar()
        print "eggs"

c = C()
c.bar()

これは、do_something()、「spam」、do_something_else()を出力してから、「eggs」を出力します。ただし、私がやりたいのは、do_something()を出力し、「ham」、do_something_else()を出力してから、「eggs」を出力することです。つまり、CのbarメソッドからBのbarメソッドを呼び出したいのですが、BではなくCのfooメソッドを呼び出したいです。

これを行う方法はありますか?私が扱っている実際のコードでは、Bクラスと実際にc.bar()を呼び出すコードの両方が、進化するサードパーティライブラリの一部であるため、それをいじくり回すことは最後の手段になることに注意してください。

4

1 に答える 1

1

あなたが投稿したコードはあなたが望むことをします。

がタイプのオブジェクトであるときをB.bar呼び出すとself.foo()、が呼び出されます。selfCC.foo

これself.fooが機能するのは、最初にself実際selfの型のメソッド-解像度-順序C3-線形化されたクラス-および-ベース-クラスのタプル(ここ(C, B, object))で検索されるためです。C.fooこれは前に戻りB.fooます。

于 2012-07-11T13:03:00.790 に答える