एक सहपाठी ने बिल्ट-इन क्लास dict को ओवरराइट करने के बारे में एक प्रश्न पूछा, और कुछ पोकिंग के बाद मैं और भी अनिश्चित हो गया।__builtins __ के लिए फिर से असाइनमेंट क्यों नहीं करता है। नया शब्द ऑब्जेक्ट्स के निर्माण को प्रभावित करता है?
अंतर्निहित निर्देश लें। मैं इस चर असाइन कर सकते हैं: dict को
>>> dict=5
>>> dict
5
अब मैं खो दिया है का उपयोग (? यह C++ में की तरह पीछा किया जाएगा या यह अलग है) लेकिन मैं अभी भी builtins .dict के माध्यम से वर्ग की पहुंच है। लेकिन मुझे लगता है कि ऊपर लिख सकते हैं और साथ:
>>> __builtins__.dict = 6
>>> __builtins__.dict
6
लेकिन फिर भी कर इस वर्ग में ही नष्ट नहीं होती है:
>>> stillDict = {'key': 'value'}
>>> stillDict
{'key': 'value'}
तो क्यों वर्ग अभी भी "काम" के बाद मैं इसे छाया लगाता है? दुभाषिया कैसे जानता है कि मैं इस असाइनमेंट के साथ एक शब्दकोश बना रहा हूं, और शब्दकोश का निर्माण कैसे किया जाता है क्योंकि इसके लिए वास्तव में __builtins__.dict
की आवश्यकता नहीं है?
संपादित थोड़ा आगे इस लेते हुए शिमोन के जवाब जो कहते हैं कि यह है क्योंकि मैं एक शब्दकोश शाब्दिक बना रहा हूं से ... अधिलेखन से पहले
, मैं यह कर सकता:
>>> a = dict()
>>> a.items
<built-in method items of dict object at 0x0000000002C97C08>
dict और __builtins__.dict
अधिलेखन के बाद, मैं यह कर सकता:
>>> b = {}
>>> b.items
<built-in method items of dict object at 0x000000000288FC88>
कौन नेतृत्व एक फॉलो-ऑन के लिए ... इनमें से दोनों अभी भी "dict ऑब्जेक्ट्स" हैं, क्या एक ताना वस्तु बनाने के लिए केवल एक कन्स्ट्रक्टर का उपयोग करके ताना वर्ग है? एक बार कक्षा में छाया डालने के बाद भी मुझे अंतर्निहित तरीकों तक पहुंच क्यों है?
मैंने एक फॉलो-ऑन संपादन जोड़ा है। –
@DanielB।: आपके संपादन में कुछ भी नहीं बदला। पायथन इंटरनेशनल में 'dict' अभी भी मौजूद है, यह सिर्फ _by name_ के लिए उपलब्ध नहीं है। 'Dict 'तक पहुंचने और उपयोग करने के लिए कोई गैर-नाम आधारित दृष्टिकोण काम करना जारी रखता है। – ShadowRanger
@DanielB। मैंने इसके बारे में जवाब का विस्तार किया है। –