https://docs.python.org/3.3/library/functions.html से #वस्तु

object में कोई __dict__ नहीं है, इसलिए आप object वर्ग के उदाहरण के लिए मनमानी विशेषताएँ निर्दिष्ट नहीं कर सकते।

क्यों "object में __dict__" नहीं है? इससे मेरा काम बनता है

>>> object.__dict__
mappingproxy({'__repr__': <slot wrapper '__repr__' of 'object' objects>, '__hash__': <slot wrapper '__hash__' of 'object' objects>, '__subclasshook__': <method '__subclasshook__' of 'object' objects>, '__ne__': <slot wrapper '__ne__' of 'object' objects>, '__format__': <method '__format__' of 'object' objects>, '__new__': <built-in method __new__ of type object at 0xa3dc20>, '__doc__': 'The most base type', '__class__': <attribute '__class__' of 'object' objects>, '__dir__': <method '__dir__' of 'object' objects>, '__delattr__': <slot wrapper '__delattr__' of 'object' objects>, '__getattribute__': <slot wrapper '__getattribute__' of 'object' objects>, '__le__': <slot wrapper '__le__' of 'object' objects>, '__init__': <slot wrapper '__init__' of 'object' objects>, '__gt__': <slot wrapper '__gt__' of 'object' objects>, '__ge__': <slot wrapper '__ge__' of 'object' objects>, '__eq__': <slot wrapper '__eq__' of 'object' objects>, '__reduce__': <method '__reduce__' of 'object' objects>, '__lt__': <slot wrapper '__lt__' of 'object' objects>, '__str__': <slot wrapper '__str__' of 'object' objects>, '__reduce_ex__': <method '__reduce_ex__' of 'object' objects>, '__sizeof__': <method '__sizeof__' of 'object' objects>, '__setattr__': <slot wrapper '__setattr__' of 'object' objects>})

क्यों "आप object वर्ग के उदाहरण के लिए मनमानी विशेषताएँ निर्दिष्ट नहीं कर सकते"?

2
Tim 3 जुलाई 2017, 10:41
4
object().__dict__ को देखें।
 – 
Ry-
3 जुलाई 2017, 10:42
4
यह object के इंस्टेंस की बात कर रहा है, ऑब्जेक्ट टाइप का नहीं।
 – 
Dimitris Fasarakis Hilliard
3 जुलाई 2017, 10:42
1
उद्धरण कहता है "object के पास __dict__" नहीं है "object के उदाहरण में __dict__" नहीं है। तो मैंने इसे गलत कैसे समझा?
 – 
Tim
3 जुलाई 2017, 21:37

1 उत्तर

सबसे बढ़िया उत्तर

आप उदाहरणों पर विशेषता के साथ __dict__ को प्रकार पर भ्रमित कर रहे हैं। object() उदाहरण में कोई __dict__ विशेषता नहीं है:

 >>> object().__dict__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute '__dict__'

ध्यान दें कि कस्टम पायथन वर्ग उदाहरणों की __dict__ विशेषता एक descriptor< है /em>; उदाहरण में ही विशेषता नहीं है, यह वह वर्ग है जो इसे प्रदान करता है (इसलिए type(instance).__dict__['__dict__'].__get__(instance) वापस कर दिया जाता है)। object.__dict__ मौजूद हो सकता है, लेकिन object.__dict__['__dict__'] नहीं।

object() इंस्टेंस विशेषताओं का समर्थन नहीं करता क्योंकि यह सभी कस्टम पायथन वर्गों के लिए आधार है, जिन्हें स्लॉट को परिभाषित करते समय __dict__ विशेषता न होने का समर्थन करें

12
Martijn Pieters 3 जुलाई 2017, 10:51
धन्यवाद। अगर मैं सही हूं, तो एक वर्ग के उदाहरण में __dict__ विशेषता होती है। तो object के उदाहरण में __dict__ विशेषता क्यों नहीं है?
 – 
Tim
3 जुलाई 2017, 10:48
@ टिम: क्योंकि अगर ऐसा होता है, तो आपके पास __dict__ विशेषता के बिना बिना कस्टम क्लास इंस्टेंस नहीं हो सकते, जैसे कि उन वर्गों के लिए जो इसके बजाय स्लॉट हैं
 – 
Martijn Pieters
3 जुलाई 2017, 10:49
1
@ टिम: मनमानी विशेषताओं का समर्थन करने के लिए आपको __dict__ मैपिंग की आवश्यकता है। इस प्रकार मनमानी विशेषताएँ काम करती हैं।
 – 
Martijn Pieters
3 जुलाई 2017, 10:51
1
@Tim: मैंने एक कारण से descriptor howto से लिंक किया है। कृपया इसे पढ़ें। इंस्टेंस पर विशेषताओं को 2 अलग-अलग तरीकों से संतुष्ट किया जा सकता है: __dict__ में कुंजियाँ, और वर्ग पदानुक्रम पर विशेषताएँ। वर्ग पदानुक्रम पर गुण वर्णनकर्ता हो सकते हैं, जो तब उदाहरण के लिए बाध्य हो जाते हैं। __dict__ को ऐसे डिस्क्रिप्टर के रूप में लागू किया जाता है, इसलिए कक्षा इसकी आपूर्ति करती है। तो हाँ, क्योंकि कक्षा (या कक्षा के माता-पिता) में एक __dict__ विशेषता होती है जो एक वर्णनकर्ता होती है, यह विशेषता सभी उदाहरणों पर काम करती है। बिल्कुल तरीकों की तरह।
 – 
Martijn Pieters
3 जुलाई 2017, 23:52
2
@ टिम: ध्यान दें कि यह type पर भी लागू होता है; यह कक्षाओं के लिए विवरणकों की आपूर्ति कर सकता है (object सहित)। object.__dict__ वास्तव में सीधे object पर एक विशेषता नहीं है, यह एक विवरणक है जो type प्रदान करता है; object.__dict__ वास्तव में type.__dict__['__dict__'].__get__(object) है। हालांकि कोई object.__dict__['__dict__'] नहीं है।
 – 
Martijn Pieters
3 जुलाई 2017, 23:55