2013-02-03 17 views
31

संभव डुप्लिकेट:
The meaning of a single- and a double-underscore before an object name in Pythonक्या अजगर में अंतर है सामने अंडरस्कोर के साथ जिम्मेदार बताते हैं और वापस

मुझे पता है कि अजगर में इन दोनों के बीच अलग है क्या चाहते

self._var1

self._var1_

self.__var1

self.__var1__

+2

संभावित डुप्लिकेट: http://stackoverflow.com/questions/1301346/the-meaning-of-a-single-and-a-double-underscore-before-an-object-name-in-python और http: //stackoverflow.com/questions/935378/python-question-about-the-difference-beetween-method-and-method –

उत्तर

56

एक प्रारंभिक बिंदु के रूप में, आप शायद PEP 8 - Style Guide For Python Code से उपयोगी इस उद्धरण मिलेगा:

इसके अलावा, प्रमुख या अंडरस्कोर अनुगामी का उपयोग कर विशेष रूपों निम्नलिखित पहचाने जाते हैं (इन्हें आम तौर पर किसी भी केस सम्मेलन के साथ जोड़ा जा सकता है):

_single_leading_underscore: कमजोर "आंतरिक उपयोग" संकेतक। जैसे from M import * ऑब्जेक्ट्स आयात नहीं करता है जिसका नाम अंडरस्कोर से शुरू होता है।

single_trailing_underscore_: पाइथन कीवर्ड के साथ विवादों से बचने के लिए सम्मेलन द्वारा उपयोग किया जाता है, उदा। Tkinter.Toplevel(master, class_='ClassName')

__double_leading_underscore: जब एक वर्ग विशेषता नामकरण, नाम mangling का आह्वान (कक्षा FooBar अंदर, __boo_FooBar__boo हो जाता है, नीचे देखें)।

__double_leading_and_trailing_underscore__: "जादू" ऑब्जेक्ट्स या विशेषताएँ जो उपयोगकर्ता द्वारा नियंत्रित नामस्थान में रहते हैं। जैसे __init__, __import__ या __file__। ऐसे नामों का आविष्कार न करें; केवल उन्हें दस्तावेज के रूप में उपयोग करें।

आप वर्ग विशेषताओं के संदर्भ में पूछा है, हालांकि, तो चलो अपने विशिष्ट उदाहरणों पर एक नज़र डालें:

एकल अग्रणी रेखांकित

अपनी कक्षा self._var1 में एक विशेषता नामकरण के उपयोगकर्ता के लिए इंगित करता है वह वर्ग जो विशेषता को केवल कक्षा के आंतरिक (या शायद उप-वर्ग के उन लोगों द्वारा) तक पहुंचाया जाना चाहिए और उन्हें सीधे इसे एक्सेस करने की आवश्यकता नहीं है और शायद इसे संशोधित नहीं करना चाहिए। आपको उसी स्थान पर अग्रणी अंडरस्कोर का उपयोग करना चाहिए, जिसका उपयोग आप जावा या सी # में private या protected फ़ील्ड का उपयोग करेंगे, लेकिन ध्यान रखें कि भाषा वास्तव में गैर-पहुंच को लागू नहीं करती है - इसके बजाय आप अपने वर्ग के उपयोगकर्ता को भरोसेमंद कुछ भी करने के लिए भरोसा नहीं करते हैं, और उन्हें अपने वर्ग के निजी क्षेत्र तक पहुंचने (या संशोधित करने) का विकल्प छोड़ दें, यदि वे वास्तव में हैं, तो वास्तव में सुनिश्चित करें कि वे जानते हैं कि वे क्या कर रहे हैं और यह समझ में आता है।

एकल प्रमुख और अंडरस्कोर

self._var1_ अनुगामी कुछ मैंने आज तक देखा नहीं है। मुझे नहीं लगता कि इस नामकरण शैली के पास पाइथन दुनिया में कोई पारंपरिक अर्थ है।

डबल अग्रणी रेखांकित

यह एक वास्तव में वाक्य महत्व है। self.__var1 का जिक्र करते हुए आपकी कक्षा के दायरे में name mangling आमंत्रित किया गया है। आपकी कक्षा के बाहर से, चर self.__var1 के बजाय self._YourClassName__var1 पर दिखाई देगा। हर कोई इसका उपयोग नहीं करता है - हम बिल्कुल भी काम नहीं करते हैं - और सरल वर्गों के लिए यह एक अग्रणी अंडरस्कोर का उपयोग करने के लिए थोड़ा बेतुका और परेशान विकल्प जैसा लगता है।

हालांकि, इसके लिए एक औचित्य है; यदि आप बहुत सारी विरासत का उपयोग कर रहे हैं, तो यदि आप केवल एक अग्रणी अंडरस्कोर का उपयोग करते हैं तो आपके पास अपने कोड को 'निजी' और 'संरक्षित' चर के बीच का अंतर पढ़ने वाले किसी व्यक्ति को इंगित करने का कोई तरीका नहीं है - जिनके अर्थ भी नहीं हैं subclasses द्वारा उपयोग किया जा सकता है, और जो subclasses का उपयोग कर सकते हैं लेकिन बाहरी दुनिया नहीं हो सकता है। 'संरक्षित' और डबल 'अंडरस्कोर' का अर्थ 'निजी' के लिए एक एकल पिछला अंडरस्कोर का उपयोग करना इस स्थिति में एक उपयोगी सम्मेलन हो सकता है (और नाम मैंगलिंग एक उप-वर्गों को बिना किसी कारण के अपने उप-वर्ग में एक ही नाम के साथ एक चर का उपयोग करने की अनुमति देगा एक टक्कर)। क्योंकि डबल प्रमुख और अनुगामी अंडरस्कोर नामकरण शैली के नाम है कि एक विशेष अर्थ नहीं होता के लिए ही इस्तेमाल किया जा करने के लिए है

डबल प्रमुख और अंडरस्कोर

self.__var1__ अनुगामी, कुछ तुम कभी नहीं बनाना चाहिए जैसा कि मैंने सचमुच यह लिखा है है पाइथन द्वारा परिभाषित, __init__ या __eq__ कक्षाओं के तरीकों की तरह। आप अपनी कक्षा के व्यवहार को बदलने के लिए उन लोगों को ओवरराइड करने के लिए स्वतंत्र हैं (वास्तव में, लगभग सभी वर्गों में प्रोग्रामर-परिभाषित __init__ होगा), लेकिन आपको self.__var1__ जैसे इस शैली में अपना नाम नहीं बनाना चाहिए।

+0

[डॉक्स] में भी विस्तृत (http://docs.python.org/2/reference/ lexical_analysis.html # आरक्षित वर्गों के-पहचानकर्ता)। –

+1

"एकल अग्रणी और पिछला अंडरस्कोर": इसका उपयोग कुछ परियोजनाओं में उपयोगकर्ता-संशोधित विशेष विधि समकक्षों के सम्मेलन के रूप में किया जाता है। हम इसे [ऋषि] (http://www.sagemath.org/doc/developer/coding_in_python.html#special-sage-functions) में उपयोग करते हैं, उदाहरण के लिए। मैंने इसे कहीं और देखा है, हालांकि मैं एक उदाहरण के बारे में नहीं सोच सकता। – DSM

+0

** डबल अग्रणी अंडरस्कोर ** की अंतिम तीन पंक्तियां इसके विपरीत होनी चाहिए: एकल अंडरस्कोर = निजी, डबल अंडरस्कोर = संरक्षित – amirteymuri

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