J'ai commencé à faire quelque chose de similaire, essentiellement l'idée était de vérifier chaque fois qu'une méthode d'une classe de base avait été implémentée ou non dans une sous-classe. Il s'est avéré comme je l'ai fait à l'origine que je ne pouvais pas détecter quand une classe intermédiaire implémentait réellement la méthode.
Ma solution de contournement était en fait assez simple; définir un attribut de méthode et tester sa présence ultérieurement. Voici une simplification de l'ensemble:
class A():
def method(self):
pass
method._orig = None
def run_method(self, *args, **kwargs):
if hasattr(self.method, '_orig'):
raise Exception('method not implemented')
self.method(*args, **kwargs)
class B(A):
pass
class C(B):
def method(self):
pass
class D(C):
pass
B().run_method()
C().run_method()
D().run_method()
MISE À JOUR: En fait, appelez method()
de run_method()
(n'est-ce pas l'esprit?) Et faites-lui passer tous les arguments non modifiés à la méthode.
PS: Cette réponse ne répond pas directement à la question. À mon humble avis, il y a deux raisons pour lesquelles on voudrait savoir quelle classe a défini une méthode; le premier est de pointer du doigt une classe dans le code de débogage (comme dans la gestion des exceptions), et le second est de déterminer si la méthode a été réimplémentée (où method est un stub destiné à être implémenté par le programmeur). Cette réponse résout ce deuxième cas d'une manière différente.