私は、サブクラスがオプションで指定された名前のメソッドを定義することができるクラス階層を持ってい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
sが重複して呼び出されます。do_it
たとえばD().do_all()
、
Do A
Do B
Do B
Do D
do_it
親を実装していないクラスからの親への重複呼び出しを回避するにはどうすればよいですか? これは、私がやろうとしていることを達成する正しい方法ですか?