मैंने कुछ हद तक समान कुछ करना शुरू कर दिया, मूल रूप से यह विचार तब भी जांच रहा था जब बेस क्लास में कोई विधि लागू की गई थी या उप-वर्ग में नहीं। जिस तरह से मैंने मूल रूप से ऐसा किया था, उसे बदल दिया, जब मैं मध्यवर्ती वर्ग वास्तव में विधि को कार्यान्वित कर रहा था तो मुझे पता नहीं लगा सका।
इसके लिए मेरा कामकाज वास्तव में काफी सरल था; एक विधि विशेषता विशेषता और बाद में इसकी उपस्थिति का परीक्षण।
class A():
def method(self):
pass
method._orig = None # This attribute will be gone once the method is implemented
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() # ==> Raises Exception: method not implemented
C().run_method() # OK
D().run_method() # OK
अद्यतन:: यहाँ पूरी बात का एक सरलीकरण है असल में run_method()
से method()
फोन (नहीं है कि भावना?) है और यह सभी तर्क विधि के लिए असंशोधित पारित किया है।
पीएस .: यह उत्तर सीधे प्रश्न का उत्तर नहीं देता है। आईएमएचओ दो कारण हैं जो एक जानना चाहते हैं कि किस वर्ग ने एक विधि परिभाषित की है; सबसे पहले डिबग कोड (जैसे अपवाद हैंडलिंग में) में एक कक्षा में उंगलियों को इंगित करना है, और दूसरा यह निर्धारित करना है कि विधि को फिर से कार्यान्वित किया गया है (जहां विधि प्रोग्रामर द्वारा लागू की जाने वाली स्टब है)। यह जवाब दूसरे मामले को एक अलग तरीके से हल करता है।
स्रोत
2014-10-15 20:44:40
पाइथन का कौन सा संस्करण आप उपयोग कर रहे हैं? 2.2 से पहले आप im_class का उपयोग कर सकते थे, लेकिन यह बाध्य स्वयं ऑब्जेक्ट के प्रकार को दिखाने के लिए बदला गया था। –
जानना अच्छा है। लेकिन मैं 2.6 का उपयोग कर रहा हूँ। –