Saya mulai melakukan sesuatu yang agak mirip, pada dasarnya idenya adalah memeriksa setiap kali metode di kelas dasar telah diterapkan atau tidak di sub kelas. Ternyata cara saya awalnya melakukannya, saya tidak dapat mendeteksi ketika kelas menengah benar-benar menerapkan metode tersebut.
Solusi saya untuk itu sebenarnya cukup sederhana; menyetel atribut metode dan menguji keberadaannya nanti. Inilah penyederhanaan semuanya:
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()
UPDATE: Sebenarnya panggil method()
dari run_method()
(bukankah itu semangatnya?) Dan minta ia meneruskan semua argumen yang tidak dimodifikasi ke metode.
PS: Jawaban ini tidak langsung menjawab pertanyaan itu. IMHO ada dua alasan seseorang ingin tahu kelas mana yang mendefinisikan metode; pertama adalah mengarahkan jari ke kelas dalam kode debug (seperti dalam penanganan pengecualian), dan yang kedua adalah menentukan apakah metode tersebut telah diimplementasikan kembali (di mana metode adalah rintisan yang dimaksudkan untuk diterapkan oleh pemrogram). Jawaban ini menyelesaikan kasus kedua dengan cara yang berbeda.