Empecé a hacer algo similar, básicamente la idea era comprobar cada vez que un método en una clase base se había implementado o no en una subclase. Resultó que, de la forma en que lo hice originalmente, no pude detectar cuándo una clase intermedia estaba implementando el método.
En realidad, mi solución fue bastante simple; establecer un atributo de método y probar su presencia más tarde. Aquí hay una simplificación de todo:
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()
ACTUALIZACIÓN: Realmente llame method()
desde run_method()
(¿no es ese el espíritu?) Y haga que pase todos los argumentos sin modificar al método.
PD: Esta respuesta no responde directamente a la pregunta. En mi humilde opinión, hay dos razones por las que uno querría saber qué clase define un método; el primero es señalar con el dedo a una clase en el código de depuración (como en el manejo de excepciones), y el segundo es determinar si el método se ha vuelto a implementar (donde el método es un código auxiliar destinado a ser implementado por el programador). Esta respuesta resuelve ese segundo caso de una manera diferente.