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 方法,但我希望调用 C 的 foo 方法,而不是 B 的。

有没有办法做到这一点?请注意,在我正在处理的实际代码中,B 类和实际调用 c.bar() 的代码都是不断发展的第三方库的一部分,因此不得已而为之。

4

1 回答 1

1

您发布的代码可以满足您的需求。

B.bar调用self.foo()whenself是一个对象类型C时,它会调用C.foo.

这是有效的,因为首先在' 实际类型的方法解析顺序 C3 线性化类和基类元组(此处)self.foo上查找。这将在之前返回。selfself(C, B, object)C.fooB.foo

于 2012-07-11T13:03:00.790 回答