Ho iniziato a fare qualcosa di simile, fondamentalmente l'idea era controllare ogni volta che un metodo in una classe base era stato implementato o meno in una sottoclasse. Nel modo in cui l'ho fatto originariamente, non sono riuscito a rilevare quando una classe intermedia stava effettivamente implementando il metodo.
La mia soluzione alternativa era abbastanza semplice in realtà; impostare un attributo di metodo e verificarne la presenza in seguito. Ecco una semplificazione dell'intera faccenda:
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()
AGGIORNAMENTO: Effettivamente chiama method()
darun_method()
(non è quello lo spirito?) E fa passare tutti gli argomenti non modificati al metodo.
PS: questa risposta non risponde direttamente alla domanda. IMHO ci sono due ragioni per cui si vorrebbe sapere quale classe ha definito un metodo; il primo è puntare il dito su una classe nel codice di debug (come nella gestione delle eccezioni), e il secondo è determinare se il metodo è stato reimplementato (dove il metodo è uno stub pensato per essere implementato dal programmatore). Questa risposta risolve il secondo caso in modo diverso.