मैंने कुछ इसी तरह से कुछ करना शुरू कर दिया, मूल रूप से यह विचार जांच कर रहा था कि जब भी बेस क्लास में कोई विधि लागू की गई थी या सब क्लास में नहीं थी। जिस तरह से मैंने मूल रूप से यह किया था, वह मुझे पता नहीं चला जब एक मध्यवर्ती वर्ग वास्तव में विधि को लागू कर रहा था।
इसके लिए मेरा वर्कअराउंड वास्तव में काफी सरल था; एक विधि विशेषता सेट करना और बाद में इसकी उपस्थिति का परीक्षण करना। यहाँ पूरी बात का एक सरलीकरण है:
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()
(नहीं है कि आत्मा?) और यह विधि के लिए unmodified सभी तर्क पारित किया है।
पुनश्च: यह उत्तर सीधे प्रश्न का उत्तर नहीं देता है। IMHO के दो कारण हैं एक जानना चाहते हैं कि किस वर्ग ने एक विधि को परिभाषित किया; पहला डिबग कोड (जैसे अपवाद हैंडलिंग) में एक वर्ग में उंगलियों को इंगित करने के लिए है, और दूसरा यह निर्धारित करने के लिए है कि क्या विधि को फिर से लागू किया गया है (जहां विधि प्रोग्रामर द्वारा लागू किया जाने वाला स्टब है)। यह उत्तर उस दूसरे मामले को एक अलग तरीके से हल करता है।