Python Encapsulation

পাইথন এনক্যাপসুলেশন বুঝুন

পাইথন এনক্যাপসুলেশন

এনক্যাপসুলেশন হল একটি ক্লাসের মধ্যে ডেটা রক্ষা করা।

এর অর্থ হল একটি ক্লাসে ডেটা (সম্পত্তি) এবং পদ্ধতিগুলি একসাথে রাখা এবং ক্লাসের বাইরে থেকে ডেটা কীভাবে অ্যাক্সেস করা যায় তা নিয়ন্ত্রণ করা।

এটি আপনার ডেটাতে আকস্মিক পরিবর্তনগুলি প্রতিরোধ করে এবং আপনার ক্লাস কীভাবে কাজ করে তার অভ্যন্তরীণ বিবরণ লুকিয়ে রাখে।

এনক্যাপসুলেশনের ধারণা:

ব্যক্তিগত তথ্য
• __age
• __salary
• __grade
সাধারণ ইন্টারফেস
• get_age()
• set_age()
• get_status()

ব্যক্তিগত তথ্য ভিতরে সুরক্ষিত. বাহ্যিক কোড শুধুমাত্র পাবলিক পদ্ধতির মাধ্যমে অ্যাক্সেস করা যেতে পারে।

ব্যক্তিগত বৈশিষ্ট্য

পাইথনে, ডবল আন্ডারস্কোর __ উপসর্গ ব্যবহার করে বৈশিষ্ট্যগুলিকে অনন্য করা যেতে পারে:

উদাহরণ

__age নামে একটি প্রাইভেট ক্লাস অ্যাট্রিবিউট তৈরি করুন:

শ্রেণীর ব্যক্তি: def __init__(নিজে, নাম, বয়স): self.name = নাম self.__age = বয়স # ব্যক্তিগত বৈশিষ্ট্য p1 = ব্যক্তি("Emil", 25) print(p1.name) # এটি কাজ করবে print(p1.__age) # এটি একটি ত্রুটি নিক্ষেপ করবে
আউটপুট:
Emil
AttributeError: 'Person' object has no attribute '__age'

⚠️দ্রষ্টব্য:

ব্যক্তিগত সম্পত্তি ক্লাসের বাইরে থেকে সরাসরি অ্যাক্সেস করা যাবে না।

গেটার এবং সেটার পদ্ধতি

প্রাপ্তির পদ্ধতি

একটি ব্যক্তিগত সম্পত্তি অ্যাক্সেস করতে, আপনি একটি গেটার পদ্ধতি তৈরি করতে পারেন:

def get_age(self):
    return self.__age

সেটার পদ্ধতি

একটি ব্যক্তিগত সম্পত্তি পরিবর্তন করতে, আপনি একটি সেটার পদ্ধতি তৈরি করতে পারেন:

def set_age(self, age):
    if age > 0:
        self.__age = age
    else:
        print("Age must be positive")

সম্পূর্ণ উদাহরণ

শ্রেণীর ব্যক্তি: def __init__(নিজে, নাম, বয়স): self.name = নাম self.__age = বয়স def get_age(self): নিজেকে ফিরে.__ বয়স def set_age(স্ব, বয়স): যদি বয়স > 0: self.__age = বয়স অন্য: মুদ্রণ ("বয়স অবশ্যই ইতিবাচক হতে হবে") p1 = ব্যক্তি("টোবিয়াস", 25) মুদ্রণ("মূল বয়স:", p1.get_age()) p1.set_age(26) মুদ্রণ("পরিবর্তিত বয়স:", p1.get_age()) p1.set_age(-5) # অবৈধ মান
আউটপুট:
Original age: 25
Modified age: 26
Age must be positive

কেন এনক্যাপসুলেশন ব্যবহার করবেন?

ডেটা সুরক্ষা

ডেটার আকস্মিক পরিবর্তন রোধ করে। স্বতন্ত্র বৈশিষ্ট্য সরাসরি পরিবর্তন করা যাবে না.

যাচাইকরণ

আপনি এটি সেট আপ করার আগে ডেটা পরীক্ষা করতে পারেন। সেটার পদ্ধতি মান পরীক্ষা করে।

নমনীয়তা

বাহ্যিক কোডকে প্রভাবিত না করেই অভ্যন্তরীণ বাস্তবায়ন পরিবর্তন করা যেতে পারে।

নিয়ন্ত্রণ

কিভাবে ডেটা অ্যাক্সেস এবং পরিবর্তন করা হয় তার উপর সম্পূর্ণ নিয়ন্ত্রণ রাখুন।

একটি বাস্তব উদাহরণ

ক্লাস ছাত্র: def __init__(স্ব, নাম): self.name = নাম self.__grade = 0 def set_grade(স্ব, গ্রেড): যদি 0 <= গ্রেড <= 100: self.__grade = গ্রেড অন্য: মুদ্রণ ("গ্রেড অবশ্যই 0 এবং 100 এর মধ্যে হতে হবে") def get_grade(self): স্বয়ং ফিরে.__গ্রেড def get_status(self): যদি স্বয়ং.__গ্রেড >= 60: ফেরত "পাস" অন্য: ফেরত "ব্যর্থ" ছাত্র = ছাত্র("এমিল") student.set_grade(85) মুদ্রণ("গ্রেড:", student.get_grade()) মুদ্রণ("স্থিতি:", student.get_status()) student.set_grade(150) # অবৈধ মান
আউটপুট:
Grade: 85
Status: Passed
Grade must be between 0 and 100

সুরক্ষিত বৈশিষ্ট্য

পাইথনের একক আন্ডারস্কোর _ উপসর্গ ব্যবহার করে সুরক্ষিত বৈশিষ্ট্যগুলির জন্য একটি নিয়ম রয়েছে:

সুরক্ষিত বৈশিষ্ট্য

একটি সুরক্ষিত বৈশিষ্ট্য তৈরি করুন:

self._property
শ্রেণীর ব্যক্তি: def __init__(নিজে, নাম, বেতন): self.name = নাম self._salary = বেতন # সুরক্ষিত বৈশিষ্ট্য p1 = ব্যক্তি("লিনাস", 50000) মুদ্রণ (p1.নাম) প্রিন্ট(p1._salary) # অ্যাক্সেসযোগ্য, কিন্তু নয়

💡গুরুত্বপূর্ণ নোট:

একটি একক আন্ডারস্কোর _ শুধুমাত্র একটি সম্মেলন। এটি অন্যান্য প্রোগ্রামারদের বলে যে বৈশিষ্ট্যটি অভ্যন্তরীণ ব্যবহারের জন্য, কিন্তু পাইথন এই সীমাবদ্ধতা প্রয়োগ করে না। এর অর্থ "ব্যবহারিকভাবে ব্যক্তিগত"।

স্বতন্ত্র পদ্ধতি

ডাবল আন্ডারস্কোর দিয়ে প্রিফিক্স করে পদ্ধতিগুলিকে ব্যক্তিগত করা যেতে পারে:

উদাহরণ

একটি ব্যক্তিগত পদ্ধতি তৈরি করুন:

ক্লাস ক্যালকুলেটর: def __init__(স্ব): self.result = 0 def __validate(self, num): যদি না হয় তাহলে (সংখ্যা, (int, float)): মিথ্যা ফেরত দিন রিটার্ন সত্য def add(self, num): যদি self.__validate(num): self.result += সংখ্যা অন্য: মুদ্রণ ("অবৈধ সংখ্যা") calc = ক্যালকুলেটর() calc.add(10) calc.add(5) প্রিন্ট ("ফলাফল:", calc.result) # calc.__validate(5) # এটি একটি ত্রুটি নিক্ষেপ করবে
আউটপুট:
Result: 15

⚠️দ্রষ্টব্য:

ডাবল আন্ডারস্কোর __ সহ ব্যক্তিগত বৈশিষ্ট্যের মতো, ব্যক্তিগত পদ্ধতিগুলিকে সরাসরি ক্লাসের বাইরে থেকে বলা যায় না। __validate পদ্ধতিটি শুধুমাত্র ক্লাসের ভিতরে অন্যান্য পদ্ধতি দ্বারা ব্যবহার করা যেতে পারে।

নাম মঙ্গল

পাইথন কীভাবে স্বতন্ত্র বৈশিষ্ট্য এবং পদ্ধতি প্রয়োগ করে তা হল নেম ম্যাংলিং।

আপনি যখন একটি ডবল আন্ডারস্কোর __ ব্যবহার করেন, পাইথন স্বয়ংক্রিয়ভাবে _ClassName অভ্যন্তরীণভাবে উপসর্গ দিয়ে এটি প্রতিস্থাপন করে।

উদাহরণ

দেখুন কিভাবে পাইথন একটি নাম জড়িয়ে ধরে:

__age → _Person__age
__validate → _Calculator__validate
শ্রেণীর ব্যক্তি: def __init__(নিজে, নাম, বয়স): self.name = নাম self.__age = বয়স p1 = ব্যক্তি("এমিল", 30) # এইভাবে পাইথন নামটি ম্যাঙ্গেল করে: print(p1.name) # Emil প্রিন্ট(p1._Person__age) #30 (প্রস্তাবিত নয়!) # মুদ্রণ(p1.__age) # ত্রুটি!
আউটপুট:
Emil
30

⚠️গুরুত্বপূর্ণ সতর্কতা:

যদিও এটি একটি ম্যাঙ্গলড নাম ব্যবহার করে পৃথক বৈশিষ্ট্য অ্যাক্সেস করা সম্ভব, এটি সুপারিশ করা হয় না। এটি এনক্যাপসুলেশনের উদ্দেশ্যকে হারায়। সর্বদা গেটার এবং সেটার পদ্ধতি ব্যবহার করুন।

অনুশীলন করুন

পাইথনে কীভাবে একটি সম্পত্তি ব্যক্তিগত করা যায়?

একটি একক আন্ডারস্কোর উপসর্গ ব্যবহার করুন: _property
✗ ভুল! একক আন্ডারস্কোর _ হল সুরক্ষিত বৈশিষ্ট্যের জন্য একমাত্র নিয়ম। এটি প্রোগ্রামারদের নির্দেশ করে যে "এটি শুধুমাত্র অভ্যন্তরীণ ব্যবহারের জন্য", কিন্তু পাইথনে অ্যাক্সেস ব্লক করে না।
একটি ডবল আন্ডারস্কোর উপসর্গ ব্যবহার করুন: __সম্পত্তি
✓ ঠিক আছে! পাইথনে, ডবল আন্ডারস্কোর __ উপসর্গ একটি বৈশিষ্ট্যকে অনন্য করে তোলে। এর ফলে নাম ম্যাঙ্গলিং হয়, যা ক্লাসের বাইরে থেকে সরাসরি প্রবেশে বাধা দেয়। উদাহরণ: self.__age, self.__salary
ব্যক্তিগত কীওয়ার্ড ব্যবহার করুন
✗ ভুল! পাইথনে কোনো ব্যক্তিগত কীওয়ার্ড নেই। পাইথনে C++ বা জাভা করার মতো ব্যক্তিগত ভাষা নেই। Python নাম ম্যাংলিং ব্যবহার করে ডবল আন্ডারস্কোর ব্যবহার করে গোপনীয়তা প্রয়োগ করে।