सभी A.__dict__.__dict__
पहले A.__dict__['__dict__']
से अलग है, और पूर्व मौजूद नहीं है। उत्तरार्द्ध __dict__
विशेषता है कि कक्षा के उदाहरण होंगे। यह एक वर्णनात्मक वस्तु है जो विशिष्ट उदाहरण के लिए विशेषताओं के आंतरिक शब्दकोश को लौटाती है। संक्षेप में, __dict__
किसी ऑब्जेक्ट की विशेषता ऑब्जेक्ट के __dict__
में संग्रहीत नहीं की जा सकती है, इसलिए इसे कक्षा में परिभाषित वर्णक के माध्यम से एक्सेस किया जाता है।
इसे समझने के लिए, आपको documentation of the descriptor protocol पढ़ना होगा।
लघु संस्करण:
- वर्ग
A
, instance.__dict__
के लिए उपयोग A.__dict__['__dict__']
द्वारा प्रदान की जाती है की एक उदाहरण के लिए जो vars(A)['__dict__']
के समान है।
- कक्षा ए के लिए,
A.__dict__
तक पहुंच type.__dict__['__dict__']
(सिद्धांत में) द्वारा प्रदान की जाती है जो vars(type)['__dict__']
के समान है।
लंबे संस्करण:
दोनों वर्गों और वस्तुओं, दोनों विशेषता ऑपरेटर (वर्ग या metaclass के __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__
ही करता है लेकिन स्पष्ट कारणों
यह instance
की __dict__
करने के लिए असंभव है के रूप में के लिए पहले छोड़ देता है उदाहरण के __dict__
में संग्रहीत किया जाए, इसे सीधे वर्णक प्रोटोकॉल के माध्यम से एक्सेस किया जाता है, और उदाहरण में एक विशेष क्षेत्र में संग्रहीत किया जाता है।
कक्षाओं के लिए एक समान परिदृश्य सत्य है, हालांकि उनके __dict__
एक विशेष प्रॉक्सी ऑब्जेक्ट है जो एक शब्दकोश होने का नाटक करता है (लेकिन आंतरिक रूप से नहीं हो सकता है), और आपको इसे बदलने या इसे किसी अन्य के साथ बदलने की अनुमति नहीं देता है। यह प्रॉक्सी आपको अन्य वर्गों के बीच विशिष्ट वर्गों के गुणों तक पहुंचने की अनुमति देता है, और इसके आधारों में से किसी एक में परिभाषित नहीं किया जाता है। उदाहरणों, __weakref__
जो weakref
द्वारा आंतरिक रूप से प्रयोग किया जाता है की विशेषताओं के भंडारण के लिए __dict__
, और वर्ग के docstring -
डिफ़ॉल्ट रूप से, एक खाली वर्ग के एक vars(cls)
तीन वर्णनकर्ता किया जाता है। यदि आप __slots__
को परिभाषित करते हैं तो पहले दो चले जा सकते हैं। तब आपके पास __dict__
और __weakref__
विशेषताएँ नहीं होंगी, लेकिन इसके बजाय आपके पास प्रत्येक स्लॉट के लिए एक एकल श्रेणी विशेषता होगी। उदाहरण के गुण तब एक शब्दकोश में संग्रहीत नहीं किए जाएंगे, और उन्हें एक्सेस कक्षा के संबंधित वर्णनकर्ताओं द्वारा प्रदान किया जाएगा।
और अंत में, असंगति कि A.__dict__
A.__dict__['__dict__']
से अलग है क्योंकि विशेषता __dict__
अपवाद द्वारा, है, कभी नहींvars(A)
में देखा, तो क्या यह के लिए सच है व्यावहारिक रूप से किसी अन्य के लिए सच नहीं है विशेषता जो आप उपयोग करेंगे। उदाहरण के लिए, A.__weakref__
A.__dict__['__weakref__']
जैसा ही है। यदि यह असंगतता मौजूद नहीं है, तो A.__dict__
का उपयोग नहीं करेगा, और आपको हमेशा vars(A)
का उपयोग करना होगा।
एक अधिक उपयुक्त उदाहरण चर 'ive' होगा। कम से कम यह इसे 'ए .__ dict __ [' ive ']' प्रश्न बना देगा;) मैं खुद को – Joakim