Python:调用子类';超级方法调用中的s方法

Python:调用子类';超级方法调用中的s方法,python,Python,编辑:我的假设是错误的;下面的代码实际上按照我的要求工作。我观察到的行为是由我正在使用的另一段代码引起的,我忽略了这段代码,因为它看起来完全不相关。 因此,我有一些如下结构的代码: class B(object): def foo(self): print "spam" def bar(self): do_something() self.foo() do_something_else() class C(B):

编辑:我的假设是错误的;下面的代码实际上按照我的要求工作。我观察到的行为是由我正在使用的另一段代码引起的,我忽略了这段代码,因为它看起来完全不相关。

因此,我有一些如下结构的代码:

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()
这将做某事(),打印“垃圾邮件”,做某事(),然后打印“鸡蛋”。然而,我想做的是做某事(),打印“火腿”,做某事(),然后打印“鸡蛋”。换句话说,我想从C的bar方法调用B的bar方法,但我想让它调用C的foo方法,而不是B的


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

您发布的代码符合您的要求

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


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

这是您想要的。。。我看不出有什么问题。所以您只能编写和修改
C
,对吗?我认为示例代码已经完成了您想要的功能-对我来说,它先打印“火腿”,然后打印“鸡蛋”。实际的代码不是这样工作的,我只能得出结论,super()导致将对象视为超类的实例。那一定是发生了什么事,但我不知道可能是什么。无论如何,谢谢你澄清这个问题。