Biraz benzer bir şey yapmaya başladım, temelde fikir, temel sınıftaki bir yöntemin bir alt sınıfta uygulanıp uygulanmadığını kontrol etmekti. Başlangıçta yaptığım gibi ortaya çıktı, bir ara sınıfın yöntemi gerçekten uyguladığını tespit edemedim.
Benim çözümüm aslında oldukça basitti; bir yöntem özelliği belirleme ve daha sonra varlığını test etme. İşte her şeyin basitleştirilmesi:
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()
GÜNCELLEME: Aslında call method()
dan run_method()
(? Ruhu bu değil) ve yönteme değiştirilmemiş bütün argümanları geçmesi gerekir.
Not: Bu yanıt, soruyu doğrudan yanıtlamaz. IMHO'nun hangi sınıfın bir yöntemi tanımladığını bilmek istemesinin iki nedeni vardır; birincisi, hata ayıklama kodunda (istisna işleme gibi) bir sınıfa parmakları işaret etmektir ve ikincisi, yöntemin yeniden uygulanıp uygulanmadığını belirlemektir (burada yöntem, programcı tarafından uygulanması amaçlanan bir saplamadır). Bu cevap, ikinci durumu farklı bir şekilde çözer.