2009-07-21 5 views
10

पायथन कक्षा विधियों और विशेषताओं के लिए private name mangling प्रदान करता है।पायथन में निजी नाम मैंगलिंग का क्या फायदा है?

क्या कोई ठोस मामला है जहां यह सुविधा आवश्यक है, या क्या यह जावा और सी ++ से अधिक है?

कृपया एक ऐसे केस का वर्णन करें जहां पाइथन नाम का उपयोग किया जाना चाहिए, यदि कोई हो?

इसके अलावा, मुझे उस मामले में कोई दिलचस्पी नहीं है जहां लेखक केवल आकस्मिक बाहरी विशेषता पहुंच को रोकने की कोशिश कर रहा है। मेरा मानना ​​है कि इस उपयोग के मामले को पायथन प्रोग्रामिंग मॉडल के साथ गठबंधन नहीं किया गया है।

उत्तर

0

आकस्मिक बाहरी विशेषता पहुंच को रोकने के लिए नाम मैंगलिंग है। ज्यादातर, यह सुनिश्चित करने के लिए है कि कोई नाम संघर्ष नहीं है।

+0

मैं मूल प्रश्न में यह उल्लेख किया है। क्या आप कह रहे हैं कि आप असहमत हैं? – cmcginty

+0

मैं कह रहा हूं कि यही कारण है। इसलिए जब आप subclass करते हैं तो आप गलती से नाम संघर्ष नहीं करते हैं। –

23

यह आंशिक रूप से आकस्मिक आंतरिक विशेषता पहुंच को रोकने के लिए आंशिक रूप से है।

अपने कोड है, जो एक पुस्तकालय है में:

class YourClass: 
    def __init__(self): 
     self.__thing = 1   # Your private member, not part of your API 

मेरे कोड में, जिसमें मैं अपने पुस्तकालय वर्ग से इनहेरिट हूँ:

class MyClass(YourClass): 
    def __init__(self): 
     # ... 
     self.__thing = "My thing" # My private member; the name is a coincidence 

निजी नाम mangling के बिना यहाँ एक उदाहरण है , आपके नाम का मेरा आकस्मिक पुन: उपयोग आपकी लाइब्रेरी को तोड़ देगा।

+0

आईएमओ, YourClass को __thing के बजाय _thing परिभाषित करना चाहिए। यह MyClass को एक्सेस करने की अनुमति देगा। दूसरा, मुझे MyClass में '__thing' का उपयोग करने का लाभ दिखाई देता है, अगर चिंता है कि आपका क्लास कार्यान्वयन बदल जाएगा। एकमात्र समस्या यह है कि अगर कोई MyClass को उपclass करना चाहता है, तो आपने उन्हें 'MyClass .__ चीज़' तक पहुंचने के लिए और अधिक कठिन बना दिया है। ऐसा लगता है कि आप "काल्पनिक" समस्या से बचाने के लिए भविष्य में पुन: उपयोग कर रहे हैं। नहीं? – cmcginty

+5

@Casey: आप सही हैं कि सदस्य चर हैं जिन्हें आप उपclasses के लिए दृश्यमान होना चाहते हैं, और जिन्हें आप एक अंडरस्कोर के साथ नामित करते हैं। आप उन्हें सी ++ में 'संरक्षित' बना देंगे। लेकिन ऐसे सदस्य भी हैं जो आप * उप-वर्गों के लिए दृश्यमान नहीं होना चाहते हैं, क्योंकि वे आपकी कक्षा के निजी कार्यान्वयन का हिस्सा हैं (और जैसा कि आप कहते हैं, वे कार्यान्वयन के अधीन हैं)। ये ये है कि नाम का नाम है। यह एक काल्पनिक समस्या नहीं है; मैंने वास्तव में वही काम किया है जिसके बारे में मैं बात कर रहा हूं, एक पुस्तकालय के साथ जो एक निजी सदस्य के लिए एक डबल के बजाय एक अंडरस्कोर का उपयोग करता है। – RichieHindle

+0

@ रिची हिंडल: बिल्कुल। सिवाय इसके कि यह एक बाहरी पहुंच है। ;) उप-वर्ग को बाहरी के रूप में देखा जाता है। –

16

PEP 8 से:

अपनी कक्षा subclassed करने का इरादा तो है, और आप गुण है कि आप उपवर्गों, का उपयोग उन्हें डबल प्रमुख अंडरस्कोर से नामकरण विचार करने के लिए नहीं करना चाहते हैं और कोई अनुगामी रेखांकित। यह पायथन के नाम को मैंगलिंग एल्गोरिदम का आह्वान करता है, जहां वर्ग का नाम विशेषता नाम में उलझा हुआ है। यह विशेषता नाम टकराव से बचने में मदद करता है उपखंडों को अनजाने में एक ही नाम के साथ गुण शामिल होना चाहिए।

(जोर जोड़ा)