2015-09-22 7 views

उत्तर

39

यह मदद करता है दुभाषिया विश्वास दिलाता हूं कि वर्ग-स्तरीय गुणों और तरीकों के लिए चाबी केवल तार हो सकता है।

कहीं और, पायथन एक "सहमति वयस्क भाषा" है, जिसका अर्थ है कि वस्तुओं के लिए डिब्बे उपयोगकर्ता द्वारा प्रकट और उत्परिवर्तनीय हैं। हालांकि, कक्षाओं के स्तर के गुणों और वर्गों के तरीकों के मामले में, यदि हम गारंटी दे सकते हैं कि चाबियां तार हैं, तो हम श्रेणी-स्तर पर विशेषता और विधि लुकअप के लिए सामान्य केस कोड को सरल और तेज़ कर सकते हैं। विशेष रूप से, नए शैली के वर्गों के लिए __mro__ खोज तर्क सरलीकृत किया जाता है और क्लास dict कुंजी को तारों को मानकर sped-up होते हैं।

+11

और उत्सुकता के लिए: 'मैपिंगप्रॉक्सी' वर्ग को बनाता है .__ dict__' केवल पढ़ने के लिए, ताकि केवल वर्ग वर्ग ___ setattr__' वर्ग विशेषताओं को सेट करने के लिए एक एवेन्यू के रूप में बनी रहे, और यह वह तरीका है जो [प्रतिबंध लागू करता है] (https://hg.python.org/cpython/file/ed694938c61a/Objects/object.c#l1132)। –

+2

यह 'टाइप .__ setattr__' (जो उम्मीद है/शायद एक बहुत छोटा सेट है) को ओवरराइड करने के लिए भी प्रासंगिक है, क्योंकि आप '__dict__' पर नहीं लिख सकते हैं; आपको 'सुपर() 'का उपयोग करना होगा। – Kevin

+2

यह भी सुनिश्चित करता है कि यदि आप कक्षा को एक नई जादू विधि देते हैं, तो पाइथन प्रासंगिक सी-स्तरीय स्लॉट अपडेट कर सकता है। यदि आप 'gc.get_referents (FooClass .__ dict __) [0] [' __ eq__ '] = eqmethod' जैसे कुछ का उपयोग करके इसे बाईपास करते हैं, तो' FooClass' के उदाहरण वास्तव में '==' तुलना के लिए 'eqmethod' का उपयोग नहीं कर सकते हैं। – user2357112

संबंधित मुद्दे