सबसे पहले A.__dict__.__dict__अलग है A.__dict__['__dict__'], और पूर्व मौजूद नहीं है। उत्तरार्द्ध वह __dict__विशेषता है जो वर्ग के उदाहरणों में होगी। यह एक वर्णनात्मक वस्तु है जो विशिष्ट उदाहरण के लिए विशेषताओं का आंतरिक शब्दकोश लौटाता है। संक्षेप में, __dict__किसी ऑब्जेक्ट की विशेषता को ऑब्जेक्ट में संग्रहीत नहीं किया जा सकता है __dict__, इसलिए इसे कक्षा में परिभाषित एक डिस्क्रिप्टर के माध्यम से एक्सेस किया जाता है।
इसे समझने के लिए, आपको डिस्क्रिप्टर प्रोटोकॉल के प्रलेखन को पढ़ना होगा ।
लघु संस्करण:
- कक्षा के उदाहरण के लिए
A, इसके लिए पहुँच instance.__dict__प्रदान की जाती है, A.__dict__['__dict__']जो उसी के समान है vars(A)['__dict__']।
- वर्ग ए के लिए, (सिद्धांत में)
A.__dict__द्वारा प्रदान किया type.__dict__['__dict__']जाता है जो कि जैसा है वैसा ही है vars(type)['__dict__']।
लंबा संस्करण:
दोनों वर्गों और वस्तुओं को विशेषता ऑपरेटर (वर्ग या मेटाक्लस के माध्यम से कार्यान्वित __getattribute__), और __dict__विशेषता / प्रोटोकॉल के माध्यम से दोनों का उपयोग करने की सुविधा प्रदान करता है vars(ob)।
सामान्य वस्तुओं के लिए, __dict__ऑब्जेक्ट एक अलग ऑब्जेक्ट बनाता है dict, जो विशेषताओं को संग्रहीत करता है, और __getattribute__पहले इसे एक्सेस करने की कोशिश करता है और वहां से विशेषताएँ प्राप्त करता है (वर्णक प्रोटोकॉल का उपयोग करके और वर्ग में कॉल करने से पहले विशेषता की तलाश करने का प्रयास करता है __getattr__)। __dict__वर्ग पर वर्णनकर्ता इस शब्दकोश के लिए उपयोग लागू करता है।
x.nameआदेश में उन लोगों की कोशिश कर के बराबर है: x.__dict__['name'], type(x).name.__get__(x, type(x)),type(x).name
x.__dict__ वही करता है लेकिन स्पष्ट कारणों के लिए पहले एक को छोड़ देता है
इसके लिए असंभव है के रूप में __dict__की instanceमें संग्रहीत करने के लिए __dict__उदाहरण के लिए, यह वर्णनकर्ता प्रोटोकॉल के माध्यम से करने के बजाय सीधे पहुंचा जा सकता है, और उदाहरण में एक विशेष क्षेत्र में संग्रहित है।
एक समान परिदृश्य कक्षाओं के लिए सच है, हालांकि उनकी __dict__एक विशेष प्रॉक्सी ऑब्जेक्ट है जो एक शब्दकोश होने का दिखावा करता है (लेकिन आंतरिक रूप से नहीं हो सकता है), और आपको इसे बदलने या इसे किसी अन्य के साथ बदलने की अनुमति नहीं देता है। यह प्रॉक्सी आपको और सभी के बीच, उस वर्ग की विशेषताओं को एक्सेस करने की अनुमति देता है जो इसके लिए विशिष्ट हैं, और इसके एक आधार में परिभाषित नहीं है।
डिफ़ॉल्ट रूप से, एक vars(cls)खाली वर्ग के तीन वर्णकों को वहन करता है - __dict__उदाहरणों की विशेषताओं को संग्रहीत करने के लिए, __weakref__जो आंतरिक रूप से weakrefऔर कक्षा के डॉकस्ट्रिंग द्वारा उपयोग किया जाता है । यदि आप परिभाषित करते हैं तो पहले दो जा सकते हैं __slots__। तब आपके पास __dict__और __weakref__विशेषताएँ नहीं होंगी , लेकिन इसके बजाय आपके पास प्रत्येक स्लॉट के लिए एक एकल वर्ग विशेषता होगी। उदाहरण की विशेषताएँ तब एक शब्दकोश में संग्रहीत नहीं की जाएंगी, और कक्षा में संबंधित विवरणकर्ताओं द्वारा उनकी पहुंच प्रदान की जाएगी।
और अंत में, विसंगति जो कि A.__dict__अलग A.__dict__['__dict__']है क्योंकि विशेषता __dict__है, अपवाद से, में कभी नहीं देखा vars(A), तो क्या यह सच है के लिए सच है व्यावहारिक रूप से किसी भी अन्य विशेषता आप उपयोग करेंगे के लिए सच नहीं है। उदाहरण के लिए, A.__weakref__जैसा है वैसा ही है A.__dict__['__weakref__']। यदि यह असंगति मौजूद नहीं थी, A.__dict__तो काम नहीं करेगा, और आपको vars(A)इसके बजाय हमेशा उपयोग करना होगा।
ive। कम से कम इसने इसे एक औरA.__dict__['ive']सवाल बना दिया होता ;) मैं खुद को बाहर देखता