【问题标题】:Python: Calling subclass's method within super method callPython:在超级方法调用中调用子类的方法
【发布时间】:2012-07-11 12:54:30
【问题描述】:

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

所以我有一些代码结构如下:

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() 的代码都是不断发展的第三方库的一部分,因此不得已而为之。

【问题讨论】:

  • 这就是你想要的...我看不出问题。
  • 所以只能写修改C吧?
  • 我认为示例代码已经完成了您想要的操作 - 对我来说,它会打印 'ham' 然后打印 'eggs'

标签: python


【解决方案1】:

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

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

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

【讨论】:

  • 嗯。实际的代码不是这样工作的,我只能得出结论 super() 导致将对象视为超类的实例。那么,肯定有其他事情发生,但我不知道它可能是什么。无论如何,感谢您澄清这个问题。
猜你喜欢
  • 2012-09-10
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 2011-12-08
  • 2021-11-10
  • 2011-10-24
  • 2018-01-22
  • 1970-01-01
相关资源
最近更新 更多