Python:在超级方法调用中调用子类的方法

时间:2012-07-11 12:54:30

标签: python

编辑:我的假设是错误的;事实上下面的代码就像我想要的那样工作。我观察到的行为最终是由我正在使用的另一部分代码引起的,我忽略了它,因为它看起来完全不相关。

所以我有一些像这样的代码:

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

有办法做到这一点吗?请注意,在我正在处理的实际代码中,B类和实际调用c.bar()的代码都是不断发展的第三方库的一部分,因此使用它是最后的手段。

1 个答案:

答案 0 :(得分:1)

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

B.barself.foo()self类型的对象时调用C,它会调用C.foo

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