পাইথন আমাদের নামের ডবল আন্ডারস্কোর prepending, ভালো দ্বারা একটি বর্গ মধ্যে 'ব্যক্তিগত' পদ্ধতি এবং ভেরিয়েবল তৈরি করার ক্ষমতা দেয়: __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!!
এনক্যাপসুলেশনের জন্য এত কিছু, তাই না?
যাইহোক, আমি সর্বদা শুনেছি পাইথন এনক্যাপসুলেশন সমর্থন করে না, তবে কেন চেষ্টা করবেন? কি দেয়?