2010-08-02 18 views
62

संभव डुप्लिकेट:
The meaning of a single- and a double-underscore before an object name in Pythonनिजी चर और अजगर में तरीके

कौन सा मैं _foo (एक अंडरस्कोर) या निजी सदस्यों और अजगर में तरीकों के लिए __bar (डबल अंडरस्कोर) इस्तेमाल करना चाहिए?

+1

आप सभी को धन्यवाद। मुझे एक और विषय मिला जो उपयोगी है। http://stackoverflow.com/questions/70528/why-are-pythons-private-methods-not-actually-private – kurikintoki

+1

बेहतर: http://stackoverflow.com/questions/1301346/the-meaning-of-a- एकल-और-एक-डबल-अंडरस्कोर-पहले-एक-ऑब्जेक्ट-नाम-इन-पायथन – laffuste

उत्तर

33

डबल अंडरस्कोर। यह नाम इस तरह से उलझाता है कि इसे कक्षा के बाहर से __fieldName के माध्यम से आसानी से एक्सेस नहीं किया जा सकता है, जो कि आप निजी होने के साथ शुरू करना चाहते हैं। (हालांकि यह अभी भी बहुत मुश्किल नहीं है क्षेत्र तक पहुँचने के लिए।)

class Foo: 
    def __init__(self): 
     self.__privateField = 4; 
     print self.__privateField # yields 4 no problem 

foo = Foo() 
foo.__privateField 
# AttributeError: Foo instance has no attribute '__privateField' 

यह बजाय _Foo__privateField के माध्यम से पहुंचा जा सकेगा। लेकिन यह चिल्लाता है "मैं निजी हूं मुझे स्पर्श न करें", जो कुछ भी नहीं है।

64

कृपया ध्यान दें कि पाइथन में "निजी विधि" जैसी कोई चीज़ नहीं है। डबल अंडरस्कोर सिर्फ mangling नाम है:

>>> class A(object): 
...  def __foo(self): 
...   pass 
... 
>>> a = A() 
>>> A.__dict__.keys() 
['__dict__', '_A__foo', '__module__', '__weakref__', '__doc__'] 
>>> a._A__foo() 

तो इसलिए __ उपसर्ग उपयोगी होता है जब आप उदाहरण के लिए, होने की mangling की जरूरत है ऊपर या विरासत श्रृंखला के नीचे नाम के साथ संघर्ष नहीं है। अन्य उपयोगों के लिए, एकल अंडरस्कोर बेहतर होगा, आईएमएचओ।

संपादित करें, __ पर भ्रम की स्थिति के बारे में, PEP-8 उस पर काफी स्पष्ट है:

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

नोट 3: सभी को नाम उलझन पसंद नहीं है। को उन्नत कॉलर्स द्वारा संभावित उपयोग के साथ आकस्मिक नाम संघर्ष से बचने की आवश्यकता है।

तो यदि आप उपclass को गलती से उसी विधि के साथ अपनी विधि को फिर से परिभाषित करने की अपेक्षा नहीं करते हैं, तो इसका उपयोग न करें।

9

डबल अंडरस्कोर। वह नाम उलझन में है। चर को अभी भी एक्सेस किया जा सकता है, लेकिन ऐसा करने के लिए आम तौर पर एक बुरा विचार है।

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

+7

बिल्कुल सही नहीं है।एक अंडरस्कोर का मतलब है कि आप किसी ऑब्जेक्ट के अनियंत्रित गुणों के साथ छेड़छाड़ कर रहे हैं जो परिवर्तन के अधीन हैं और आप ऑब्जेक्ट द्वारा बनाए गए इनवेरिएंट को अच्छी तरह से तोड़ सकते हैं ताकि आप समझ सकें कि आप ऑब्जेक्ट encapsulation तोड़ने का फैसला करते हैं तो आप क्या कर रहे हैं। – msw

-3

क्योंकि यह कोडिंग सम्मेलन है। अधिक के लिए here देखें।

+4

ओपी पूछ रहा था कि किस का उपयोग करना है। क्यों नहीं। – Ponkadoodle

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