Empecé a hacer algo similar, básicamente la idea era verificar cada vez que se implementaba un método en una clase base o no en una subclase. Resultó como lo hice originalmente. No pude detectar cuándo una clase intermedia realmente estaba implementando el método.
Mi solución para esto fue bastante simple en realidad; estableciendo un método atributo y probando su presencia más tarde. He aquí una simplificación de todo el asunto:
class A():
def method(self):
pass
method._orig = None # This attribute will be gone once the method is implemented
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() # ==> Raises Exception: method not implemented
C().run_method() # OK
D().run_method() # OK
ACTUALIZACIÓN: En realidad llamar method()
de run_method()
(no es que el espíritu?) Y tienen que pasar todos los argumentos sin modificar el método.
P.S .: Esta respuesta no responde directamente la pregunta. En mi humilde opinión, hay dos razones por las que uno querría saber qué clase definió un método; 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 ha sido reimplementado (donde el método es un apéndice destinado a ser implementado por el programador). Esta respuesta resuelve ese segundo caso de una manera diferente.
¿Qué versión de Python estás usando? Antes 2.2 podías usar im_class, pero eso fue cambiado para mostrar el tipo del objeto self encuadernado. –
Es bueno saberlo. Pero estoy usando 2.6. –