6

मैं थोड़ा इस व्यवहार से उलझन में हूँ (अजगर 3.2 का प्रयोग करके):अजगर डबल अंडरस्कोर mangling

class Bar: 
    pass 

bar = Bar() 
bar.__cache = None 
print(vars(bar))  # {'__cache': None} 

class Foo: 
    def __init__(self): 
     self.__cache = None 

foo = Foo() 
print(vars(foo))  # {'_Foo__cache': None} 

मैं कैसे डबल अंडरस्कोर विशेषता नाम "घायल" होने का कारण बन पर थोड़ा पढ़ा है, लेकिन मैं उपरोक्त दोनों मामलों में एक ही नाम-उलझन की उम्मीद करता।

What is the meaning of a single- and a double-underscore before an object name?

कोई भी विचार यहाँ क्या हो रहा है?

+4

mangling की बात ठीक ** रोकने के लिए है ** सही ढंग से काम से अपने दूसरे मामले। इरादा बाहरी कोड से विशेषता छिपाना है। – millimoose

उत्तर

10

नाम mangling एक class बयान के मूल्यांकन के दौरान होता है। Bar के मामले में, __cache विशेषता वर्ग के हिस्से के रूप में परिभाषित नहीं है, बल्कि इस तथ्य के बाद एक विशेष वस्तु को जोड़ा गया।

(वास्तव में, कि नहीं पूरी तरह से सही हो सकता है नाम mangling __new__ विधि के मूल्यांकन के दौरान हो सकता है;।। मैं नहीं जानता कि लेकिन परवाह किए बिना, अपने __cache एक वस्तु, वर्ग कोड से नहीं जोड़ा करने के लिए स्पष्ट रूप से जोड़ दिया जाता है ।)

+4

यह संकलन के दौरान उलझ गया है। आप इसे देखने के लिए 'dis.dis()' फ़ंक्शन का उपयोग कर सकते हैं, बस 'आयात डी; dis.dis (Foo .__ init __) 'यह देखने के लिए कि नाम पहले से ही उलझा हुआ है। स्पष्टीकरण के लिए –

+0

बहुत उपयोगी, thx – gnr

7
docs

निजी नाम mangling से

: एक पहचानकर्ता है कि किसी तरह से टेक्स्ट एक वर्ग परिभाषा में होता है दो या अधिक अंडरस्कोर वर्ण और साथ शुरू होता है जब दो या अधिक अंडरस्कोर में खत्म नहीं होता है, यह है उस श्रेणी का निजी नाम माना जाता है। उनके नाम कोड उत्पन्न होने से पहले निजी नाम लंबे प्रारूप में परिवर्तित हो जाते हैं। परिवर्तन नाम के सामने वर्ग का नाम डाला गया है, जिसमें अग्रणी अंडरस्कोर हटा दिए गए हैं, और कक्षा नाम के सामने डाला गया एक एकल अंडरस्कोर है। उदाहरण के लिए, पहचानकर्ता __spam हैम नामक कक्षा में होने वाली _Ham__spam में परिवर्तित हो जाएगा। यह परिवर्तन सिंटैक्टिकल संदर्भ से स्वतंत्र है जिसमें पहचानकर्ता का उपयोग किया जाता है। यदि परिवर्तित नाम बहुत लंबा है (255 वर्णों से लंबा), कार्यान्वयन परिभाषित परिभाषा हो सकती है। यदि वर्ग का नाम केवल अंडरस्कोर होता है, तो कोई परिवर्तन नहीं किया जाता है।

आप अपनी संपत्ति बताए जाते हैं के बाद कक्षा में परिभाषित किया गया

+0

दस्तावेज़ों से लिंक टूटा हुआ है –

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