Я почав робити щось подібне, в основному ідея полягала в перевірці кожного разу, коли метод у базовому класі був реалізований чи ні в підкласі. Виявившись так, як я це робив спочатку, я не міг виявити, коли проміжний клас насправді реалізовував метод.
Моє обхідне рішення було насправді досить простим; встановлення атрибута методу та перевірка його присутності пізніше. Ось спрощення всього:
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()
ОНОВЛЕННЯ: Насправді виклик method()
від run_method()
(це не дух?) І нехай він передає всі аргументи, не змінені, методу.
PS: Ця відповідь не відповідає безпосередньо на питання. IMHO є дві причини, чому хотілося б знати, який клас визначив метод; перший - вказати пальцем на клас у коді налагодження (наприклад, при обробці винятків), а другий - визначити, чи метод був повторно реалізований (де метод - заглушка, призначена для реалізації програмістом). Ця відповідь вирішує цю другу справу по-іншому.