दिलचस्प पोस्ट
एक डेवलपमेंट LAMP सर्वर पर PHP 5.x के कई संस्करण कैसे चला सकते हैं? वैश्विक और वर्ग स्थिर चर के लिए सी + + कॉल डिस्ट्रक्टर्स क्या है? विभिन्न कंटेनरों से इटेरेटर की तुलना करना एक हस्ताक्षरित एप्लिकेशन के लिए प्रमुख हैश ढूंढें एक सरणी से बेतरतीब ढंग से एक तत्व कैसे चुनें पायथन में मेटाक्लास क्या है? जावा में दो तारों के बीच स्ट्रिंग निकालें त्रुटि: संसाधन कॉन्फ़िगरेशन में त्रुटि एक सरणी को रखने के लिए अपेक्षित प्रतिक्रिया है लेकिन एक ऑब्जेक्ट मिला है? जीमेल: 530 5.5.1 प्रमाणीकरण आवश्यक है। अधिक जानें क्या NuGet के लिए संकुल के स्थान को बदलना संभव है? GUID / UUID डेटाबेस कुंजियों के फायदे और नुकसान वैकल्पिक वर्ण से मेल करने के लिए रेगेक्स कोणीय जेएस के साथ स्ट्रिंग को कैसे विभाजित किया जाए मेरी साइट के वैकल्पिक संस्करण में मोबाइल डिवाइस को रीडायरेक्ट करें Android java.exe गैर-शून्य निकास मान 1 के साथ समाप्त हुआ

पायथन की 'निजी' विधियां वास्तव में निजी क्यों नहीं हैं?

पायथन हमें 'निजी' विधियों और चर को भीतर के नाम के आधार पर डबल अंडरस्कोर बनाकर एक वर्ग के भीतर बनाने की क्षमता देता है, जैसे: __myPrivateMethod() । फिर, यह कैसे समझा सकता है?

 >>> class MyClass: ... def myPublicMethod(self): ... print 'public method' ... def __myPrivateMethod(self): ... print 'this is private!!' ... >>> obj = MyClass() >>> obj.myPublicMethod() public method >>> obj.__myPrivateMethod() Traceback (most recent call last): File "", line 1, in AttributeError: MyClass instance has no attribute '__myPrivateMethod' >>> dir(obj) ['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod'] >>> obj._MyClass__myPrivateMethod() this is private!! 

क्या बात है?!

मैं इसे उन लोगों के लिए थोड़ा समझाऊँगा जिनके पास काफी कुछ नहीं था।

 >>> class MyClass: ... def myPublicMethod(self): ... print 'public method' ... def __myPrivateMethod(self): ... print 'this is private!!' ... >>> obj = MyClass() 

मैंने क्या किया है वहां एक सार्वजनिक विधि और एक निजी पद्धति के साथ एक वर्ग बना रहा है और इसे तुरंत शुरू किया गया है

इसके बाद, मैं अपनी सार्वजनिक विधि को बुलाता हूं।

 >>> obj.myPublicMethod() public method 

इसके बाद, मैं कोशिश करता हूं और अपनी निजी विधि को बुलाता हूं।

 >>> obj.__myPrivateMethod() Traceback (most recent call last): File "", line 1, in AttributeError: MyClass instance has no attribute '__myPrivateMethod' 

सब कुछ यहां अच्छा लगता है; हम इसे कॉल करने में असमर्थ हैं। यह वास्तव में, 'निजी' है ठीक है, वास्तव में यह नहीं है। ऑब्जेक्ट पर चलने वाली डायर () एक नई जादुई विधि से पता चलता है कि अजगर आपके सभी निजी तरीकों के लिए जादुई बनाता है।

 >>> dir(obj) ['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod'] 

इस नई विधि का नाम हमेशा एक अंडरस्कोर होता है, उसके बाद कक्षा नाम, विधि नाम के बाद।

 >>> obj._MyClass__myPrivateMethod() this is private!! 

इतना encapsulation के लिए, एह?

किसी भी स्थिति में, मैं हमेशा सुना होगा कि अजगर समर्थन के लिए समर्थन नहीं करता है, तो क्यों भी कोशिश? क्या देता है?

Solutions Collecting From Web of "पायथन की 'निजी' विधियां वास्तव में निजी क्यों नहीं हैं?"

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

उदाहरण के लिए:

 >>> class Foo(object): ... def __init__(self): ... self.__baz = 42 ... def foo(self): ... print self.__baz ... >>> class Bar(Foo): ... def __init__(self): ... super(Bar, self).__init__() ... self.__baz = 21 ... def bar(self): ... print self.__baz ... >>> x = Bar() >>> x.foo() 42 >>> x.bar() 21 >>> print x.__dict__ {'_Bar__baz': 21, '_Foo__baz': 42} 

बेशक, यह टूट जाता है यदि दो अलग-अलग वर्गों का एक ही नाम है।

निजी फ़ंक्शन का उदाहरण

 import re import inspect class MyClass : def __init__(self) : pass def private_function ( self ) : try : function_call = inspect.stack()[1][4][0].strip() # See if the function_call has "self." in the begining matched = re.match( '^self\.', function_call ) if not matched : print 'This is Private Function, Go Away' return except : print 'This is Private Function, Go Away' return # This is the real Function, only accessible inside class # print 'Hey, Welcome in to function' def public_function ( self ) : # i can call private function from inside the class self.private_function() ### End ### 

से http://www.faqs.org/docs/diveintopython/fileinfo_private.html

कड़ाई से बोलते हुए, निजी तरीके अपने वर्ग के बाहर सुलभ हैं, बस आसानी से सुलभ नहीं हैं। पायथन में कुछ भी वास्तव में निजी नहीं है; आंतरिक रूप से, निजी विधियों और विशेषताओं के नाम उलझन में हैं और मक्खी पर बेदखल होने के कारण उन्हें अपने दिए गए नामों से दुर्गम प्रतीत होता है। आप एमपी 3 फ़िलीइन्फो क्लास के __परस विधि को _MP3FileInfo__parse नाम से एक्सेस कर सकते हैं। स्वीकार करें कि यह दिलचस्प है, फिर कभी वादा नहीं करता, यह वास्तविक कोड में कभी नहीं किया। निजी तरीकों एक कारण के लिए निजी हैं, लेकिन अजगर में कई अन्य चीजों की तरह, उनका निजीकरण अंततः सम्मेलन की बात है, मजबूर नहीं है।

जब मैं पहली बार जावा से अजगर आया था, तो मैंने इसे नफरत किया। यह मुझे मौत के लिए डरा दिया

आज यह सिर्फ एक बात है जो मुझे अजगर के बारे में सबसे अधिक पसंद है

मुझे एक मंच पर होना पसंद है, जहां लोग एक-दूसरे पर भरोसा करते हैं और ऐसा महसूस नहीं करते कि उन्हें उनके कोड के आसपास अभेद्य दीवारों का निर्माण करने की आवश्यकता है। कूटबद्ध भाषाओं में, यदि कोई एपीआई एक बग है, और आपको पता चला है कि क्या गलत है, तो आप इसके आसपास काम करने में असमर्थ हो सकते हैं क्योंकि आवश्यक विधि निजी है पायथन में रवैया है: "निश्चित" अगर आपको लगता है कि आप इस स्थिति को समझते हैं, शायद आपने इसे पढ़ लिया है, तो हम सभी को "शुभकामनाएँ" कह सकते हैं!

याद रखें, encapsulation भी "सुरक्षा", या लॉन बंद बच्चों को रखने से भी कमजोर नहीं है। यह सिर्फ एक और पैटर्न है जिसे कोड बेस को समझना आसान समझना चाहिए।

आमतौर पर इस्तेमाल किया जाने वाला वाक्यांश "हम सभी वयस्कों को यहां सहमति दे रहे हैं" एक एकल अंडरस्कोर (प्रदर्शित न करें) या डबल अंडरस्कोर (छिपाना) के पूर्व में, आप अपने क्लास के उपयोगकर्ता को बता रहे हैं कि आप सदस्य को किसी तरह से 'निजी' होने का इरादा रखते हैं। हालांकि, आप सभी को भरोसेमंद ढंग से व्यवहार करने और उनका सम्मान करने के लिए भरोसा कर रहे हैं, जब तक कि उनके पास कोई आकर्षक कारण न हो (जैसे डिबगर्स, कोड पूरा)।

यदि आपके पास वास्तव में कुछ खास है जो निजी है, तो आप इसे एक एक्सटेंशन में कार्यान्वित कर सकते हैं (जैसे सी के लिए सीपीथन) ज्यादातर मामलों में, हालांकि, आप केवल चीजें करने के पायथनिक तरीके से सीखते हैं

ऐसा नहीं है कि आप पूरी तरह से किसी भी भाषा में सदस्यों की निजीकरण के आसपास (सी ++ में सूचक अंकगणित, .NET / जावा में प्रतिबिंब) नहीं मिल सकते हैं।

मुद्दा यह है कि यदि आप दुर्घटना से निजी विधि को कॉल करने की कोशिश करते हैं तो आपको एक त्रुटि मिलती है लेकिन अगर आप अपने आप को पैर में गोली मारना चाहते हैं, तो आगे बढ़ो और इसे करें

संपादित करें: आप ओ ओ-एनकॅप्सुलेशन द्वारा अपनी सामग्री को सुरक्षित करने की कोशिश नहीं करते हैं, है ना?

इसी तरह के व्यवहार तब होते हैं जब मॉड्यूल विशेषता नाम एकल अंडरस्कोर (जैसे _foo) से शुरू होते हैं

मॉड्यूल विशेषताओं को नामित किया गया है, जैसे कि from* विधि from* उपयोग करते समय आयात मॉड्यूल में प्रतिलिपि नहीं किया जाएगा, जैसे:

 from bar import * 

हालांकि, यह एक सम्मेलन है और कोई भाषा बाधा नहीं है। ये निजी विशेषताओं नहीं हैं; वे किसी भी आयातक द्वारा संदर्भित और हेरफेर कर सकते हैं कुछ लोगों का तर्क है कि इस वजह से, पायथन सच एनकॅप्सुलेशन लागू नहीं कर सकता है।

यह केवल उन भाषा डिजाइन विकल्पों में से एक है कुछ स्तर पर वे उचित हैं वे इसे बनाते हैं ताकि आपको कोशिश करने और विधि को कॉल करने के लिए अपने रास्ते से बहुत दूर जाना पड़े, और यदि आपको वास्तव में इसकी ज़रूरत है, तो आपके पास बहुत अच्छा कारण होना चाहिए!

डिबगिंग हुक और टेस्टिंग संभवतया आवेदक के रूप में ध्यान में आते हैं, जिम्मेदारी से ज़ाहिर हैं।

class.__stuff नामकरण सम्मेलन प्रोग्रामर को __stuff है कि वह बाहर से __stuff तक पहुंचने के लिए नहीं है। नाम उलझन में यह संभावना नहीं है कि कोई भी दुर्घटना से ऐसा करेगा।

सच है, आप अभी भी इस के आसपास काम कर सकते हैं, यह अन्य भाषाओं (जो कि बीटीडब्ल्यू भी आपको ऐसा करने देती है) की तुलना में भी आसान है, लेकिन कोई पायथन प्रोग्रामर ऐसा नहीं करेगा अगर वह इनकैप्सुलेशन के बारे में परवाह करता है

पायथन 3.4 के साथ यह व्यवहार है:

 >>> class Foo: def __init__(self): pass def __privateMethod(self): return 3 def invoke(self): return self.__privateMethod() >>> help(Foo) Help on class Foo in module __main__: class Foo(builtins.object) | Methods defined here: | | __init__(self) | | invoke(self) | | ---------------------------------------------------------------------- | Data descriptors defined here: | | __dict__ | dictionary for instance variables (if defined) | | __weakref__ | list of weak references to the object (if defined) >>> f = Foo() >>> f.invoke() 3 >>> f.__privateMethod() Traceback (most recent call last): File "<pyshell#47>", line 1, in <module> f.__privateMethod() AttributeError: 'Foo' object has no attribute '__privateMethod' 

https://docs.python.org/3/tutorial/classes.html#tut-private

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

यहां तक ​​कि अगर सवाल बूढ़ा है तो मुझे आशा है कि मेरा स्निपेट उपयोगी हो सकता है