2016-03-19 8 views
7

एक सहपाठी ने बिल्ट-इन क्लास 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 ऑब्जेक्ट्स" हैं, क्या एक ताना वस्तु बनाने के लिए केवल एक कन्स्ट्रक्टर का उपयोग करके ताना वर्ग है? एक बार कक्षा में छाया डालने के बाद भी मुझे अंतर्निहित तरीकों तक पहुंच क्यों है?

उत्तर

4

{'key': 'value'} एक शब्दकोश शब्दकोष है ताकि एक शब्दकोशकोष का उत्पादन करने का व्यवहार जारी रहे। अजगर को देखने के लिए क्या मतलब है dict की जरूरत नहीं है - एक शब्दकोश के निर्माण के लिए यह इस चरण को छोड़ देता है और सीधे बाइट कोड उत्पन्न करता है:

>>> def f(): {'a': 3} 
>>> import dis 
>>> dis.dis(f) 
    1   0 BUILD_MAP    1 
       3 LOAD_CONST    1 (3) 
       6 LOAD_CONST    2 ('a') 
       9 STORE_MAP 
      10 POP_TOP 
      11 LOAD_CONST    0 (None) 
      14 RETURN_VALUE 

बाइट कोड यह पहले की तरह BUILD_MAP का उपयोग जारी है में (यानी, यह बनाता है एक आपके द्वारा लिखे गए कोड के आधार पर मानचित्र/शब्दकोश)।

जैसा कि आपने उल्लेख किया है dict का अर्थ बदल गया है।


अनुवर्ती प्रश्न के बारे में: आप छाया नहीं किया है शब्दकोश वर्ग/प्रकार - आप केवल क्या dict साधन के अर्थ बदल दिया है। आप शब्दकोष का प्रकार नहीं ले सकते हैं और पाइथन शब्दकोष का उपयोग करते समय इसे उत्पन्न करता है (उदाहरण के लिए, {})।

एक बार जब आप प्रकार का ऑब्जेक्ट है dict आप अपने तरीकों (जैसे items()) की पहुंच है - यह सिर्फ है कि आप इसे वाक्य रचना (जो आप को प्रभावित नहीं कर सकते हैं) का प्रयोग कर बनाया गया है बल्कि dict() के लिए एक कॉल की तुलना में (आप जो प्रभावित कर सकते हैं)।

+0

मैंने एक फॉलो-ऑन संपादन जोड़ा है। –

+0

@DanielB।: आपके संपादन में कुछ भी नहीं बदला। पायथन इंटरनेशनल में 'dict' अभी भी मौजूद है, यह सिर्फ _by name_ के लिए उपलब्ध नहीं है। 'Dict 'तक पहुंचने और उपयोग करने के लिए कोई गैर-नाम आधारित दृष्टिकोण काम करना जारी रखता है। – ShadowRanger

+0

@DanielB। मैंने इसके बारे में जवाब का विस्तार किया है। –

संबंधित मुद्दे

 संबंधित मुद्दे