我有一个继承结构,我希望在使用" 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"也应该在超类上调用。
这是否可行,如果可以,我怎么能
答案 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
的子类可以覆盖f
,g
和h
,而不会影响对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
。