से विस्तार पढ़ हाँ, यह उपयोगी है और प्रस्तुत करते है एक उद्देश्य है, लेकिन ऐसा करना भी दुर्लभ है। यदि आपको लगता है कि आपको परिभाषित किए जाने के बाद कक्षाओं को पैच करने की आवश्यकता है तो आपको हमेशा रोकना चाहिए और विचार करना चाहिए कि यह वास्तव में सबसे अच्छा तरीका है या नहीं।
एक स्थिति बंदर-पैचिंग है।मैं एक बड़ी प्लोन प्रणाली जहां कुछ तरीकों मामूली बदलाव की जरूरत है लेकिन वहाँ तो बस किसी भी आसान तरीका सामान्य रूप से व्यवहार को ओवरराइड करने के लिए नहीं था में यह कर दिया है। उस स्थिति में जहां आपके पास जटिल पुस्तकालय है, यह मूल पुस्तकालय को बदलने के बिना नए या संशोधित व्यवहार को इंजेक्ट करने का एक आसान तरीका प्रदान करता है।
अन्य स्थिति यह है कि मन में स्प्रिंग्स है जब आप तरीकों कि स्वचालित रूप से उत्पन्न किया जा सकता है की एक बहुत कुछ करना चाहते हैं। जैसे डेटा संचालित परीक्षण।
def createTest(testcase, somedata, index):
def test(self):
"Do something with somedata and assert a result"
test_name = "test_%d" % index
setattr(testcase, test_name, test)
for index, somedata in enumerate(somebigtable):
createTest(MyTestCase, somedata, index)
जब MyTestCase एक unittest.TestCase है आप एक परीक्षण है कि डेटा के सभी के माध्यम से चला जाता है हो सकता है, लेकिन यह पहली असफलता पर बंद हो जाता है और आप की तुलना में जो डेटा की लाइन में विफल रहा है यह पता लगाने की कोशिश करने के लिए है। गतिशील रूप से विधियों को बनाकर सभी परीक्षण अलग-अलग चलते हैं और परीक्षण का नाम आपको बताता है कि कौन सा विफल रहा है (ऊपर दिए गए कोड का मूल वास्तव में कुछ डेटा और साथ ही इंडेक्स से अधिक अर्थपूर्ण नाम भी बनाया गया है)।
आप कोई रास्ता नहीं या तो कक्षा या उसके शब्दकोश संदर्भित करने के लिए इससे पहले कि परिभाषा पूरा हो गया है, क्योंकि वर्ग के शरीर के अंदर ऐसा नहीं कर सकते। आप फिर भी एक metaclass है कि आप कक्षा में ही बनाने से पहले वर्ग dict को संशोधित करने और कभी कभी उस चीज़ का एक ही तरह करने का एक क्लीनर तरीका है की सुविधा देता है के रूप में के साथ इसी तरह कुछ कर सकते हैं।
नोट करने के लिए दूसरी बात यह है कि स्थितियों में, जहां इस काम नहीं करेगा देखते हैं है। के बाद वर्ग बना दिया गया है कुछ __xxx__
विशेष तरीकों ओवरराइड नहीं किया जा सकता है: मूल परिभाषा आंतरिक रूप से वर्ग के __dict__
तो कोई भी परिवर्तन आप बाद में बनाने अनदेखी हो सकती है के अलावा कहीं अन्य सहेजा गया है। अगर मेटाक्लास के साथ काम करना भी कभी-कभी अतिरिक्त कार्यों को मेटाक्लास क्लास परिभाषा के हिस्से के रूप में विशेषताओं को जो भी उपचार देता है, वह नहीं मिलेगा।
दिलचस्प! यह भी संकेत देता है कि एक और मूल्य उन तरीकों की परिभाषा को आगे बढ़ा सकता है जो कक्षा के लिए कहीं भी केंद्रीय नहीं हैं। जाहिर है विशेष परिस्थितियों के लिए। –