我有一个类层次结构,其中子类可以选择定义一个具有给定名称的方法,比如do_it
,并希望do_all
在基类中编写一个函数,比如 ,以确保每个这样的方法都将按照类层次结构的顺序执行。我能达到的最接近的目标是:
class A(object):
def do_it(self):
print 'Do A'
def do_all(self):
# Better, from comments and answers: vars(type(self))
for c in reversed(self.__class__.__mro__[:-1]):
c.do_it(self)
class B(A):
def do_it(self):
print 'Do B'
class C(B):
def no_do_it(self):
pass
class D(C):
def do_it(self):
print 'Do D'
这几乎可以按预期工作,例如B().do_all()
给出
Do A
Do B
但它会导致对B
sdo_it
的所有派生类的重复调用。例如D().do_all()
给出
Do A
Do B
Do B
Do D
如何避免do_it
从不实现它的类对父类的重复调用?这甚至是实现我想要做的事情的正确方法吗?