दिलचस्प पोस्ट
IE का पता लगाने के लिए Modernizr का उपयोग करने के लिए सही तरीका है? एक साथ दो winform खिड़कियां भागो डेटा फ़ोल्डर में कैमरा के रूप में एक यूरी कैसे प्राप्त करें? JavaScript का उपयोग करके एक DIV की सामग्री प्राप्त करें सबसे सटीक परिणाम प्राप्त करने के लिए किस आदेश में जोड़ा जाना चाहिए? क्या जावास्क्रिप्ट / jQuery में HTML तत्व ऑब्जेक्ट क्लोन करना संभव है? क्लासनोटफ़ाउंड एक्सपैशन डिस्पैचरस्पोर्ट टॉमकेट लॉन्च करते समय (मवेन निर्भरताएं wtpwebapps की नकल नहीं की गईं) ऑब्जेक्ट फाइल को अलग उपडिरेक्टरी में कैसे रखा जाए कुछ फ़ोनों में "यह ऐप गलत कॉन्फ़िगरेशन के साथ बनाया गया" त्रुटि क्यों हुई? पिक्सल में एक्शनबार का आकार क्या है? जावा में डाटाबेस कनेक्शन बंद करना एएसएएस और एसडीओ के माध्यम से एमएक्स के साथ फाइल खोलें क्या करता है? पी बनाम रूबी में डालता है क्लोन और मूल रिमोट रिपॉजिटरी के बीच git diff

ऑब्जेक्ट नाम से पहले एकल और एक डबल अंडरस्कोर का क्या अर्थ है?

मैं इसे एक बार और सभी के लिए साफ़ करना चाहता हूं। क्या कोई कृपया पायथन में एक ऑब्जेक्ट के नाम से पहले अंडरस्कोर्स होने का सटीक अर्थ समझा सकता है? एक सिंगल और एक डबल अग्रणी अंडरस्कोर के बीच अंतर भी समझाओ। इसके अलावा, क्या इसका मतलब यही रहता है कि प्रश्न में ऑब्जेक्ट एक चर, एक फ़ंक्शन, एक विधि आदि है?

Solutions Collecting From Web of "ऑब्जेक्ट नाम से पहले एकल और एक डबल अंडरस्कोर का क्या अर्थ है?"

एकल अंडरस्कोर

एक वर्ग में नाम, एक प्रमुख अंडरस्कोर के साथ, केवल अन्य प्रोग्रामरों को इंगित करने के लिए कि विशेषता या पद्धति का उद्देश्य निजी है हालांकि, नाम के साथ विशेष कुछ भी नहीं किया गया है

PEP-8 उद्धरित करने के लिए:

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

डबल अंडरस्कोर (नाम मंगलिंग)

पायथन डॉक्स से :

फ़ॉर्म __spam किसी भी पहचानकर्ता (कम से कम दो प्रमुख अंडरस्कोर, अधिकतम एक अनुगामी अंडरस्कोर पर) को टेक्स्ट के साथ _classname__spam बदल दिया जाता है, जहां _classname__spam वर्तमान _classname__spam नाम है जिसमें प्रमुख अंडरस्कोर छीन लिया गया है। यह संदिग्ध पहचानकर्ता की वाक्य-रचनात्मक स्थिति के संबंध में किया जाता है, इसलिए इसका उपयोग क्लास-निजी इंस्टेंस और क्लास चर, विधि, विश्व में संग्रहीत चर, और यहां तक ​​कि उदाहरणों में संग्रहीत चर को परिभाषित करने के लिए किया जा सकता है। अन्य कक्षाओं के उदाहरणों पर इस वर्ग के लिए निजी

और एक ही पृष्ठ से एक चेतावनी:

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

उदाहरण

 >>> class MyClass(): ... def __init__(self): ... self.__superprivate = "Hello" ... self._semiprivate = ", world!" ... >>> mc = MyClass() >>> print mc.__superprivate Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: myClass instance has no attribute '__superprivate' >>> print mc._semiprivate , world! >>> print mc.__dict__ {'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'} 

बहुत अच्छे उत्तर अभी तक हैं लेकिन कुछ ख़ास ख़बरें नहीं हैं। एक एकल अग्रणी अंडरस्कोर बिल्कुल एक सम्मेलन नहीं है: यदि आप __all__ from foobar import * उपयोग करते हैं, और मॉड्यूल __all__ एक __all__ सूची को परिभाषित नहीं करते हैं, तो मॉड्यूल से आयात किए गए नामों में उन प्रमुख __all__ शामिल नहीं होते हैं। मान लें कि यह ज्यादातर एक सम्मेलन है, क्योंकि यह मामला एक बहुत ही अस्पष्ट कोने 😉 है।

प्रमुख-अंडरस्कोर सम्मेलन का उपयोग केवल निजी नामों के लिए ही नहीं है, बल्कि यह भी कि सी ++ संरक्षित लोगों को क्या कहते हैं – उदाहरण के लिए, उन तरीकों के नाम जो उप-कक्षाओं द्वारा ओवरराइड होने का पूरी तरह से इरादा है (यहां तक ​​कि जिनके बाद में ओवरराइड होना चाहिए वे बेस क्लास जो raise NotImplementedError ! -) अक्सर उस क्लास (या raise NotImplementedError ) के उदाहरणों का उपयोग करके कोड को इंगित करने के लिए एकल- raise NotImplementedError -अंडरस्कोर नाम होते हैं, जो कहा गया है कि तरीकों का इस्तेमाल सीधे तौर पर नहीं किया जाना चाहिए।

उदाहरण के लिए, फीफो की तुलना में एक अलग-अलग कतारबद्ध अनुशासन के साथ एक धागा-सुरक्षित कतार बनाने के लिए, एक आयात कतार, उपवर्गों क्यू। क्यूउ, और ऐसे तरीकों को _get और _put रूप में अध्यारोहित करता है; "क्लाइंट कोड" उन ("हुक") तरीकों को कभी नहीं बुलाता है, बल्कि ("आयोजन") सार्वजनिक विधियों जैसे कि put और get (यह टेम्पलेट विधि डिजाइन पैटर्न के रूप में जाना जाता है – उदाहरण के लिए यहां पर एक दिलचस्प प्रस्तुति के लिए देखें इस विषय पर मेरी बात की एक वीडियो, ट्रांसक्रिप्ट के सारांश के साथ)।

__foo__ : यह सिर्फ एक सम्मेलन है, पायथन प्रणाली के नामों का उपयोग करने का एक तरीका है जो उपयोगकर्ता नामों के साथ संघर्ष नहीं करेगा।

_foo : यह सिर्फ एक सम्मेलन है, एक प्रोग्रामर के लिए यह इंगित करने का तरीका है कि वेरिएबल निजी है (जो भी पायथन में इसका मतलब है)।

__foo : इसका वास्तविक अर्थ है: दुभाषिया _classname__foo साथ इस नाम को बदलता है यह सुनिश्चित करने के लिए कि नाम दूसरे वर्ग में समान नाम से ओवरलैप नहीं करेगा।

पायथन दुनिया में किसी भी अन्य प्रकार के अंडरस्कोर का अर्थ नहीं है।

इन सम्मेलनों में वर्ग, वैरिएबल, ग्लोबल आदि में कोई अंतर नहीं है।

._variable है और सिर्फ सम्मेलन के लिए मतलब है

.__variable अक्सर ग़लत ढंग से superprivate माना जाता है, जबकि इसका वास्तविक अर्थ केवल आकस्मिक पहुंच को रोकने के लिए namemangle है [1]

.__variable__ आमतौर पर निर्मित विधियों या चर के लिए आरक्षित है

अगर आप सख्त चाहते हैं तो आप अभी भी। डबल नामों को सिर्फ नाम से जोड़ता है, या नाम बदलता है, instance._className__mangled लिए कुछ चर। _className__mangled

उदाहरण:

 class Test(object): def __init__(self): self.__a = 'a' self._b = 'b' >>> t = Test() >>> t._b 'b' 

t._b सुलभ है क्योंकि यह केवल सम्मेलन द्वारा छिपा हुआ है

 >>> t.__a Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Test' object has no attribute '__a' 

टी। एक नहीं मिला क्योंकि यह नाममार्गिंग के कारण अब मौजूद नहीं है

 >>> t._Test__a 'a' 

सिर्फ डबल अंडरस्कोर नाम के बजाय example._className__ तक पहुँचने से, आप छुपा मूल्य एक्सेस कर सकते हैं

शुरुआत में एकल अंडरस्कोर:

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

 class BaseForm(StrAndUnicode): def _get_errors(self): "Returns an ErrorDict for the data provided for the form" if self._errors is None: self.full_clean() return self._errors errors = property(_get_errors) 

डीजेंगो स्रोत कोड से लेकर कोड स्निपेट (डीजेँगो / रूप / रूपों) इसका मतलब है कि त्रुटियां एक संपत्ति है, और यह मॉड्यूल का हिस्सा है, लेकिन इस संपत्ति कॉल, _get_errors, "निजी" है, इसलिए आपको इसे एक्सेस नहीं करना चाहिए।

शुरुआत में दो अंडरस्कोर:

इससे बहुत भ्रम हो जाता है इसे निजी विधि बनाने के लिए उपयोग नहीं किया जाना चाहिए। इसे किसी उप-क्लास द्वारा ओवरराइड करने के लिए अपनी पद्धति से बचने के लिए या अकस्मात उपयोग किए जाने के लिए इस्तेमाल किया जाना चाहिए चलो एक उदाहरण देखें:

 class A(object): def __test(self): print "I'm test method in class A" def test(self): self.__test() a = A() a.test() 

आउटपुट:

 $ python test.py I'm test method in class A 

अब उप-वर्ग बी बनाएं और __ टेस्ट विधि के लिए अनुकूलन करें

 class B(A): def __test(self): print "I'm test method in class B" b = B() b.test() 

आउटपुट होगा ….

 $ python test.py I'm test method in class A 

जैसा हमने देखा है, ए टेस्ट () ने बी। टेस्ट () तरीके कॉल नहीं किए, जैसा कि हम उम्मीद कर सकते हैं लेकिन वास्तव में, यह __ के लिए सही व्यवहार है। इसलिए जब आप __ से शुरु करते हुए एक विधि बनाते हैं, तो इसका मतलब है कि आप किसी को इसे ओवरराइड करने में सक्षम नहीं करना चाहते हैं, यह केवल अपनी कक्षा के अंदर ही पहुंच योग्य होगा।

शुरुआत और अंत में दो रेखांकित:

जब हम __this__ जैसी कोई विधि देखते हैं, तो इसे कॉल न करें। क्योंकि इसका मतलब है कि यह एक तरीका है जो अजगर कॉल करता है, आपके द्वारा नहीं। चलो एक नज़र डालते हैं:

 >>> name = "test string" >>> name.__len__() 11 >>> len(name) 11 >>> number = 10 >>> number.__add__(40) 50 >>> number + 50 60 

हमेशा एक ऑपरेटर या देशी फ़ंक्शन होता है जो इन जादू विधियों को कॉल करता है। कभी-कभी विशिष्ट स्थितियों में केवल एक हुक अजगर कॉल होती है उदाहरण के लिए __init__() को तब कहा जाता है जब ऑब्जेक्ट को __new__() के बाद बनाया जाता है, जिसे उदाहरण बनाने के लिए कहा जाता है …

चलिए एक उदाहरण लेते हैं …

 class FalseCalculator(object): def __init__(self, number): self.number = number def __add__(self, number): return self.number - number def __sub__(self, number): return self.number + number number = FalseCalculator(20) print number + 10 # 10 print number - 20 # 40 

अधिक जानकारी के लिए पीईपी -8 गाइड अधिक मदद करेगा।

अजगर में अधिक जादू पद्धतियां यहां देखें https://github.com/RafeKettler/magicmethods/blob/master/magicmethods.pdf

कभी-कभी आपके पास जो एक प्रमुख अंडरस्कोर के साथ एक ट्यूपल प्रतीत होता है

 def foo(bar): return _('my_' + bar) 

इस मामले में, क्या हो रहा है कि _ () स्थानीयकरण फ़ंक्शन के लिए एक उपनाम है जो पाठ पर चलती है ताकि उसे उचित भाषा में डाल दिया जाए, उदाहरण के लिए, स्पिंक्स ऐसा करता है, और आप आयात के बीच मिलेंगे

 from sphinx.locale import l_, _ 

और sphinx.locale में, _ () कुछ स्थानीयकरण फ़ंक्शन के उपनाम के रूप में निर्दिष्ट किया गया है।

यदि कोई वास्तव में केवल पढ़ने योग्य एक शब्द बनाना चाहता है, तो आईएमएचओ सबसे अच्छा तरीका है संपत्ति () का उपयोग करने के लिए केवल प्राप्तकर्ता के पास होगा। संपत्ति के साथ () हम डेटा पर पूरा नियंत्रण कर सकते हैं

 class PrivateVarC(object): def get_x(self): pass def set_x(self, val): pass rwvar = property(get_p, set_p) ronly = property(get_p) 

मैं समझता हूं कि ओपी ने थोड़ा अलग सवाल पूछा, लेकिन चूंकि मुझे एक और सवाल मिला है कि 'निजी चर को कैसे निर्धारित किया जाए' इस एक के साथ नकल की नकल है, मैं इस अतिरिक्त जानकारी को जोड़ने के बारे में सोचा था।

एकल अग्रणी अंडरस्कोर एक सम्मेलन है दुभाषिया के दृष्टिकोण से कोई अंतर नहीं है, चाहे नाम एक अंडरस्कोर से शुरू हो या न हो।

डबल अग्रणी और अनुगामी अंडरस्कोर का उपयोग अंतर्निहित तरीकों, जैसे __init__ , __bool__ , आदि के लिए किया जाता है।

डबल अग्रणी रेखांकित w / ओ समकक्षों अनुगामी एक सम्मेलन भी हैं, हालांकि, वर्ग तरीकों दुभाषिया द्वारा उलझाया जाएगा चर या बुनियादी फ़ंक्शन नामों के लिए कोई अंतर नहीं मौजूद है।

आपका प्रश्न अच्छा है, यह न केवल तरीकों के बारे में है मॉड्यूल में फ़ंक्शंस और ऑब्जेक्ट्स आमतौर पर एक अंडरस्कोर के साथ प्रीफ़िक्सेल भी हैं, और इसे दो के द्वारा प्रीफ़िक्स किया जा सकता है।

लेकिन __double_underscore नाम मॉड्यूल में नाम-उलझन में नहीं हैं, उदाहरण के लिए। क्या होता है कि यदि आप एक मॉड्यूल (मॉड्यूल आयात * से) आयात करते हैं, न ही एक (या अधिक) अंडरस्कोर से शुरू होने वाले नामों का आयात नहीं किया जाता है, न ही सहायता (मॉड्यूल) में दिखाए गए नाम हैं।

"निजी" इंस्टेंस वेरिएबल्स जिन्हें किसी ऑब्जेक्ट के अंदर के अलावा एक्सेस नहीं किया जा सकता है पायथन में मौजूद नहीं है। हालांकि, वहाँ एक सम्मेलन है जो सबसे अधिक पायथन कोड द्वारा पीछा किया जाता है: अंडरस्कोर (जैसे _spam) के साथ प्रीफ़िक्ल्ड नाम को एपीआई के गैर-सार्वजनिक भाग के रूप में माना जाना चाहिए (चाहे वह फ़ंक्शन, कोई विधि या डेटा सदस्य है) । इसे बिना किसी सूचना के कार्यान्वयन के विवरण और परिवर्तन के अधीन माना जाना चाहिए।

संदर्भ https://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references

यहां डबल अंडरस्कोर गुण कैसे एक विरासत कक्षा प्रभावित कर सकते हैं पर एक सरल उदाहरण उदाहरण है। तो निम्न सेटअप के साथ:

 class parent(object): __default = "parent" def __init__(self, name=None): self.default = name or self.__default @property def default(self): return self.__default @default.setter def default(self, value): self.__default = value class child(parent): __default = "child" 

यदि आप फिर अजगर REPL में एक बच्चा उदाहरण बनाते हैं, तो आप नीचे देखेंगे

 child_a = child() child_a.default # 'parent' child_a._child__default # 'child' child_a._parent__default # 'parent' child_b = child("orphan") ## this will show child_b.default # 'orphan' child_a._child__default # 'child' child_a._parent__default # 'orphan' 

यह कुछ के लिए स्पष्ट हो सकता है, लेकिन यह मुझे एक और अधिक जटिल वातावरण में गार्ड से पकड़ लिया

_ और __ के तथ्यों को प्राप्त करना बहुत आसान है; अन्य जवाब उन्हें बहुत अच्छी तरह से व्यक्त करते हैं। उपयोग निर्धारित करने के लिए बहुत कठिन है

यह है जैसे मैं इसे देखता हूँ:

 _ 

यह इंगित करने के लिए उपयोग किया जाना चाहिए कि फ़ंक्शन सार्वजनिक उपयोग के लिए नहीं है, उदाहरण के लिए एपीआई यह और आयात प्रतिबंध यह सी # में internal तरह व्यवहार करता है।

 __ 

वारसिस कारावास में नाम टक्कर से बचने के लिए और देर से बाध्य होने से बचने के लिए इस्तेमाल किया जाना चाहिए। बहुत सी निजी में सी #

==>

यदि आप यह इंगित करना चाहते हैं कि कुछ सार्वजनिक उपयोग के लिए नहीं है, लेकिन इसे protected उपयोग की तरह कार्य करना चाहिए _ यदि आप यह इंगित करना चाहते हैं कि कुछ सार्वजनिक उपयोग के लिए नहीं है, लेकिन इसे private उपयोग की तरह कार्य करना चाहिए __

यह एक उद्धरण भी है जो मुझे बहुत पसंद है:

समस्या यह है कि एक वर्ग के लेखक वैध रूप से सोच सकते हैं कि "इस विशेषता / विधि का नाम निजी होना चाहिए, इस वर्ग परिभाषा के भीतर से ही पहुंच योग्य" हो और __ निजी सम्मेलन का उपयोग करें। लेकिन बाद में, उस क्लास का उपयोगकर्ता उप-वर्ग बना सकता है जिसे वैधता उस नाम तक पहुंच की आवश्यकता होती है। इसलिए या तो सुपर क्लास को संशोधित किया जाना चाहिए (जो मुश्किल या असंभव हो सकता है), या उपवर्ग कोड को मैन्युअल रूप से गंदा नामों का उपयोग करना पड़ता है (जो सबसे खराब और नाजुक है)।

लेकिन मेरी राय में यह समस्या मेरी राय में है कि यदि कोई आईडीई नहीं है जो आपको चेतावनी देता है कि जब आप विधियों को ओवरराइड करते हैं, तो त्रुटि को खोजने में आपको थोड़ी देर लग सकती है अगर आपके पास आधार-कक्षा से किसी विधि को ओवरराइड किया जा सकता है