Zacząłem robić coś podobnego, zasadniczo chodziło o sprawdzenie, czy metoda w klasie bazowej została zaimplementowana, czy nie w podklasie. Okazało się, że tak jak pierwotnie to zrobiłem, nie mogłem wykryć, kiedy klasa pośrednia faktycznie implementowała tę metodę.
Moje obejście było całkiem proste; ustawienie atrybutu metody i późniejsze sprawdzenie jego obecności. Oto uproszczenie całej rzeczy:
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()
AKTUALIZACJA: Właściwie wywołaj method()
from run_method()
(czy to nie jest duch?) I przekaż wszystkie niezmodyfikowane argumenty do metody.
PS: Ta odpowiedź nie odpowiada bezpośrednio na pytanie. IMHO Istnieją dwa powody, dla których chciałoby się wiedzieć, która klasa zdefiniowała metodę; pierwszym jest wskazanie palcem klasy w kodzie debugowania (na przykład w obsłudze wyjątków), a drugim jest określenie, czy metoda została ponownie zaimplementowana (gdzie metoda jest kodem pośrednim przeznaczonym do zaimplementowania przez programistę). Ta odpowiedź rozwiązuje ten drugi przypadek w inny sposób.