2011-09-30 18 views
7

मैंने कोड देखा है जिसमें फ़ंक्शंस/स्थिरांक अंडरस्कोर के साथ प्रीफ़िक्स किए गए हैं। मेरी समझ यह है कि यह इंगित करता है कि उनका उपयोग सीधे नहीं किया जाना चाहिए। क्या मैं कक्षाओं के साथ ऐसा कर सकता हूं?क्या यह अंडरस्कोर के साथ निजी कक्षाओं को उपसर्ग करने का एक सम्मेलन है?

class _Foo(object): 
    pass 

class __Bar(object): 
    pass 
+3

'__' पायथन द्वारा आरक्षित है। कभी इसका इस्तेमाल न करें। इससे ज्यादातर मामलों में नाम उलझन में समस्या आती है। इस बारे में सोचने से बचने की कोशिश करें। इसे "आरक्षित" और "सामान्य उपयोग के लिए नहीं" और "होने वाली प्रतीक्षा में आने वाली समस्या" के बारे में सोचने का प्रयास करें। और फिर, कृपया इसे अपने प्रश्न से बाहर ले जाएं। –

+0

कृपया बताएं कि "निजी" वर्ग क्या हो सकता है। क्या आप एक उपयोग केस या ऐसी स्थिति प्रदान कर सकते हैं जिसमें आप इसका उपयोग करेंगे? –

+0

निर्यात किए गए फ़ंक्शंस होंगे जिन्हें उपयोगकर्ता का उपयोग करना चाहिए। इन कार्यों में, यह इन "निजी" कक्षाओं को तुरंत चालू करेगा। – canadadry

उत्तर

6

बेहतर केवल _ का उपयोग करें। यह इंगित करता है कि एक मॉड्यूल के भीतर एक नाम निजी है।

यह कैच-सभी from <module> import * के साथ आयात नहीं किया गया है, और इसमें कुछ अन्य सुविधाएं जैसे "पसंदीदा विनाश" हैं।

here से:

तो __all__ परिभाषित नहीं है, जनता के नाम के सेट सभी के नाम मॉड्यूल के नाम स्थान में पाया जो एक अंडरस्कोर केरेक्टर नहीं करते हैं ('_')।

here से:

संस्करण 1.5 के साथ शुरू, अजगर गारंटी देता है कि वैश्विक जिसका नाम एक एकल अंडरस्कोर के साथ शुरू होता है उनकी मॉड्यूल से नष्ट हो जाती हैं इससे पहले कि अन्य वैश्विक नष्ट हो जाती हैं।

डबल अंडरस्कोर कक्षा के सदस्य शुरू करने वाले name-mangled हैं।

5

हां; एकल अंडरस्कोर उपयोग पीईपी 8 द्वारा आंतरिक उपयोग कक्षाओं के लिए अनुमोदित है।

मुझे विश्वास नहीं है कि डबल अंडरस्कोर उपयोग का अधिकांश वास्तविक प्रभाव होगा, क्योंकि इसका उपयोग कक्षा गुणों के लिए सक्रिय नाम के लिए किया जाता है, और आमतौर पर एक वर्ग किसी अन्य वर्ग की विशेषता नहीं है (माना जाता है, यह हो सकता है, जो मामले में अजगर खुशी से आप के लिए नाम वध करना होगा।)

2

आप किसी भी चर में पहले वर्ण के रूप में एक अंडरस्कोर उपयोग कर सकते हैं, लेकिन यह निहित अर्थ किया जाता है, "के बाहर का उपयोग न करें कक्षा/मॉड्यूल जब तक कि आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं "(उदाहरण के लिए लक्षित/आंतरिक) और यदि आप from <module> import * का उपयोग करते हैं तो यह आयात नहीं होगा।

एक डबल अंडरस्कोर का उपयोग करना कुछ ऐसा है जो आपको किसी वर्ग के बाहर कभी नहीं करना चाहिए क्योंकि यह अन्यथा नाम से गड़बड़ कर सकता है (और "मैं" कर सकता हूं, मेरा मतलब है, "पिछले हफ्ते मुझे एक बड़ा सिरदर्द हुआ क्योंकि मुझे एहसास नहीं हुआ यह करता है ")।

2

हां, और यह केवल एक सम्मेलन नहीं है। जब आप इस मॉड्यूल से import *, अंडरस्कोर से शुरू होने वाले नाम आयात नहीं किए जाएंगे।

+1

glglgl का उत्तर देखें - यह केवल तभी होता है जब '__all__' परिभाषित नहीं किया गया हो। यदि आप चाहें तो आप अपने '__all__' में अंडरस्कोर प्रीफ़िक्स्ड नाम शामिल कर सकते हैं। – agf

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