Python继承 - 为剩余的调用堆栈调用父方法

时间:2018-03-23 22:15:15

标签: python

我有一个继承结构,我希望在使用" super"调用父类方法后,为调用堆栈的其余部分调用父类方法。这可能吗?

class Parent(object):
    def f(self):
        self.g()

    def g(self):
        self.h()

    def h(self):
       print 1


class Child(Parent):
    def f(self):
        super(Child, self).g()

    def g(self):
        self.h()

    def h(self):
        print 2


c = Child()
c.f()

此代码输出" 2"因为当超级方法" g"调用" h",它调用子类方法。

我希望它输出1," h"也应该在超类上调用。

这是否可行,如果可以,我怎么能

2 个答案:

答案 0 :(得分:1)

除非您特别想在那里使用子类实现,否则不要让Parent方法调用self的公共方法。相反,让您的公共方法委托给“私有”方法:

class Parent(object):
    def __f(self):
        self.__g()

    def f(self):
        return self.__f()

    def __g(self):
        self.__h()

    def g(self):
        return self.__g()

    def __h(self):
       print 1

    def h(self):
        return self.__h()

Parent的子类可以覆盖fgh,而不会影响对super().f()super().g()的调用行为,或super().h(),子类可以使用相同的技术,而不会因名称重整而干扰父方法。

或者,您可以Parent直接调用Parent实现:

class Parent(object):
    def f(self):
        Parent.g(self)

    def g(self):
        Parent.h(self)

    def h(self):
       print 1

无论哪种方式,重要的是不要调用self.some_public_method,除非你真的想要使用some_public_method的子类实现。

答案 1 :(得分:0)

child调用父类g时,child不会放弃其作为Child的固有身份:即使它仍然存在贯穿Parent.g。在调用self.h时,self的类仍然是Child,而不是Parent,并且控制传递给Child.h

如果您希望此工作正常,则需要使用Parent.h方法覆盖Child,或明确调用Parent.h。我建议你先做 - 如果你不想让方法h被覆盖,那就非常简单,不要覆盖它。例如,调用Child方法child_h