Python にクラス 'D' のオブジェクトがあり、'D' とその祖先 ('A'、'B'、'C') で定義されている 'run' メソッドを順次実行したいと考えています。
私はこのようにこれを達成することができます
class A(object):
def run_all(self):
# I prefer to execute in revere MRO order
for cls in reversed(self.__class__.__mro__):
if hasattr(cls, 'run'):
# This works
cls.run(self)
# This doesn't
#cls.__getattribute__(self, 'run')()
def run(self):
print "Running A"
class B(A):
def run(self):
print "Running B"
class C(A):
def run(self):
print "Running C"
class D(C, B):
def run(self):
print "Running D"
if __name__ == "__main__":
D().run_all()
その結果、
$ python test.py
Running A
Running B
Running C
Running D
ただし、実際には、実行されるメソッドの名前はわかりません。しかし、getattribute () (コメントを参照) 行を使用してこれを試してみると、機能しません。
$ python test.py
Running D
Running D
Running D
Running D
だから私の質問は:
なぜ機能しないのですか?
これはこれを行うための最良の方法ですか?