पायथन हमें इस तरह नाम के लिए डबल अंडरस्कोर लगाकर एक वर्ग के भीतर 'निजी' तरीके और चर बनाने की क्षमता देता है __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!!
इतना एनकैप्सुलेशन के लिए, एह?
किसी भी मामले में, मैंने हमेशा सुना होगा पायथन एनकैप्सुलेशन का समर्थन नहीं करता है, इसलिए भी कोशिश क्यों करें? क्या देता है?