सबसे पहले 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']
सवाल बना दिया होता ;) मैं खुद को बाहर देखता