বাস্তবিক অর্থে (প্র্যাক্টিক্যালি), পাইথনে প্রাইভেট মেম্বার ভেরিয়েবল নামে কিছু নেই। যাইহোক, শুরুতে দুটি আন্ডারস্কোর (__) যোগ করলে একটি ভেরিয়েবল বা মেথড প্রাইভেট হয় এটিই অধিকাংশ পাইথন কোড দ্বারা ব্যবহৃত কনভেনশন।
একটি উদাহরণের মাধ্যমে এই কনসেপ্ট বুঝি:
privateVar1.py
class myClass:
__privateVar = 27
def __privMeth(self):
print("I'm inside class myClass")
def hello(self):
print("Private Variable value: ", myClass.__privateVar)
foo = myClass()
foo.hello()
foo.__privateMeth
উপরের প্রোগ্রামে, __privMeth একটি প্রাইভেট মেথড এবং __privateVar একটি প্রাইভেট ভেরিয়েবল। এখন এর আউটপুট দেখি:
আউটপুট
Private Variable value: 27 Traceback (most recent call last): File "C:/Python/Python361/privateVar1.py", line 12, infoo.__privateMeth AttributeError: 'myClass' object has no attribute '__privateMeth'
উপরের আউটপুট থেকে আমরা দেখতে পাচ্ছি যে "myClass" ক্লাসের বাইরে থেকে, আপনি প্রাইভেট মেথড এবং প্রাইভেট ভেরিয়েবল অ্যাক্সেস করতে পারবেন না। যাইহোক, ক্লাসের ভেতরে (myClass) আমরা প্রাইভেট ভেরিয়েবল অ্যাক্সেস করতে পারি। hello() মেথডে, __privateVar ভেরিয়েবল অ্যাক্সেস করা হয়েছে (উপরে দেখানো: "Private Variable value: 27")।
সো উপরের উদাহরণ থেকে আমরা বুঝতে পারি যে ক্লাসের ভেতরে সকল ভেরিয়েবল এবং মেথড ডিফল্টভাবে পাবলিক। যখন আমরা ডেটা মেম্বারকে প্রাইভেট ডিক্লোর করি মানে সেগুলো শুধু ক্লাসের ভেতরে অ্যাক্সেসযোগ্য এবং ক্লাসের বাইরে থেকে অ্যাক্সেসযোগ্য নয়। ভেরিয়েবল বা মেথডকে প্রাইভেট করার এই টেকনিককে ডেটা ম্যাংগলিং (data mangling) বলা হয়। __spam ফর্মের যেকোনো আইডেন্টিফায়ার (কমপক্ষে দুটি লিডিং আন্ডারস্কোর, সর্বোচ্চ একটি ট্রেইলিং আন্ডারস্কোর) টেক্সটুয়ালি _classname__spam-এ রিপ্লেস করা হয়, যেখানে classname হলো একটি লিডিং আন্ডারস্কোর ছাড়া বর্তমান ক্লাসের নাম। এই ম্যাংগলিং সিনট্যাক্টিক্যাল পজিশন যাচাই ছাড়া করা হয়, যতক্ষণ না এটি একটি ক্লাসের ডেফিনিশনের মধ্যে থাকে।
ডাবল আন্ডারস্কোর নামগুলো সাবক্লাস দ্বারা অকস্মাত ওভাররাইডিং এড়াতে ব나다।