কম্পিউটার টিউটোরিয়াল

পাইথন ইনহেরিটেন্স: ধাপে ধাপে গাইড

পাইথন ইনহেরিটেন্স হল যখন একটি সাবক্লাস অন্য একটি ক্লাসের কোড ব্যবহার করে। ইনহেরিটেন্স পাইথনের মতো অবজেক্ট-ওরিয়েন্টেড ভাষায় একটি অপরিহার্য বৈশিষ্ট্য যা কোডিংকে সহজ এবং দক্ষ করে তোলে।


পাইথন একটি অবজেক্ট-ওরিয়েন্টেড ভাষা, অর্থাৎ এটি পুনঃব্যবহারযোগ্য কোড ব্লক তৈরি করতে সাহায্য করে যাতে কোড আরও দক্ষ হয়। এটি ঘটার একটি উপায় হল ইনহেরিটেন্স, যেখানে একটি সাবক্লাস অন্য ক্লাসের কোড ব্যবহার করতে পারে।

উদাহরণস্বরূপ, আপনার কাছে একটি ক্লাস থাকতে পারে যা "ব্যাংক অ্যাকাউন্ট" সংরক্ষণ করে, এবং আপনি একটি সাবক্লাস তৈরি করতে চান যা "গোল্ড ব্যাংক অ্যাকাউন্ট" সংরক্ষণ করবে এবং বিদ্যমান "ব্যাংক অ্যাকাউন্ট" ক্লাসের অ্যাট্রিবিউট রেফারেন্স করতে পারবে।

এই টিউটোরিয়ালে, আমরা পাইথনে ইনহেরিটেন্সের বেসিক বিষয়গুলো ভাঙে ফেলব। আমরা প্যারেন্ট এবং চাইল্ড পাইথন ক্লাস কীভাবে কাজ করে, এবং ক্লাস অবজেক্টের সাথে কাজ করার সময় অ্যাট্রিবিউট এবং মেথড কীভাবে ওভাররাইড করতে হয় সেটাও আলোচনা করব।

পাইথন ইনহেরিটেন্স

ইনহেরিটেন্স হল একটি টার্ম যা অন্য একটি ক্লাসের ভিতরে একটি পাইথন ক্লাসকে বর্ণনা করতে ব্যবহৃত হয়। সাবক্লাস বা চাইল্ড ক্লাস বলা ক্লাসগুলো প্যারেন্ট ক্লাস থেকে মান ইনহেরিট করতে পারে, ঠিকैसे বাস্তব জগতে সন্তান তাদের পিতামাতা থেকে বৈশিষ্ট্য উত্তরাধিকার সরে পান।

ইনহেরিটেন্স কার্যকর কারণ এটি আমাদের সাবক্লাস তৈরি করতে দেয় যেগুলোর একই মানের ধরন থাকে প্যারেন্ট ক্লাসের মতো, কিন্তু সেই টাইপগুলো বারবার ডিক্লেয়ার করতে হয় না।

প্যারেন্ট ক্লাস

প্যারেন্ট ক্লাস (যাকে বেস ক্লাসও বলা হয়) वो মাস্টার স্ট্রাকচার তৈরি করে যা সাবক্লাস অ্যাক্সেস করতে পারে। আমরা একাধিক সাবক্লাস তৈরি করতে পারি zonder প্যারেন্ট ক্লাস থেকে ডেরাইভড ক্লাস মেথডের একই সেট সাধারণ মানগুলো বারবার ডিক্লেয়ার না করেই।

চলুন একটি উদাহরণ দিয়ে দেখি এটি কীভাবে কাজ করে। ধরুন আমাদের কাছে একটি প্রোগ্রাম আছে যা দুটি ভিন্ন ব্যাংক অ্যাকাউন্ট টাইপের সাথে কাজ করে: প্যারেন্ট এবং চাইল্ড।

এই দুটি অ্যাকাউন্টই ব্যাংক অ্যাকাউন্ট, তাই তাদের সমান মান থাকবে। কিন্তু প্রতিটি অ্যাকাউন্টের নিজস্ব уникаল তথ্য থাকতে পারে। উদাহরণস্বরূপ, একটি প্যারেন্টের অ্যাকাউন্ট ওভারড্রাফ সাপোর্ট করতে পারে, যখন চাইল্ডের অ্যাকাউন্ট শুধু ব্যালেন্সের সাথে কাজ করতে পারে।

তাই, যদি আমরা এই মানগুলোর সাথে একটি প্রোগ্রাম তৈরি করতে চাই, তবে প্রথমে আমরা আমাদের ব্যাংক অ্যাকাউন্টের জন্য একটি ক্লাস ডিফাইন করব (একটি প্যারেন্ট ক্লাস) তারপর আমরা যে দুটি ব্যাংক অ্যাকাউন্ট টাইপ সাপোর্ট করতে চাই—প্যারেন্ট এবং চাইল্ড—তাদের জন্য চাইল্ড ক্লাস তৈরি করব।

এখানে একটি প্যারেন্ট ক্লাস ডিক্লেয়ার করার উদাহরণ দেওয়া হল:

class BankAccount:
    def __init__(self, forename, surname, balance):
        self.forename = forename
        self.surname = surname
        self.balance = balance

আমরা BankAccount ক্লাসটি তৈরি করেছি যা তিনটি মান সংরক্ষণ করে: forename, surname, এবং balance। আমরা আমাদের ক্লাসে মেথডও যোগ করতে পারি, যেমন:

class BankAccount:
    def __init__(self, forename, surname, balance):
        self.forename = forename
        self.surname = surname
        self.balance = balance
    def getDetails(self):
        print("Forename: ", self.forename)
        print("Surname: ", self.surname)
    def getBalance(self):
        print("Balance: $ ", self.balance)

এখন আমাদের ক্লাস তিনটি মান এবং দুটি নতুন মেথড সংরক্ষণ করে: details এবং balance। details মেথডটি ব্যবহার করে আমরা আমাদের অ্যাকাউন্ট হোল্ডারের forename এবং surname জানতে পারি, এবং balance মেথডটি অ্যাকাউন্ট হোল্ডারের ব্যালেন্স রিটার্ন করবে।

BankAccount ক্লাসে ডিক্লেয়ার করা প্রতিটি মেথড এবং ভেরিয়েবল আমাদের চাইল্ড ক্লাসে অ্যাক্সেসযোগ্য থাকবে।

আমাদের ক্লাসকে একশনে দেখানোর জন্য, চলুন একটি উদাহরণ ব্যাংক অ্যাকাউন্ট তৈরি করি। আমরা নিচের কোড ব্যবহার করে তা করতে পারি:

account = BankAccount("John", "Appleseed", 100)

এটি John Appleseed এর জন্য একটি অ্যাকাউন্ট তৈরি করবে যাতে $100 থাকে। এখন যেহেতু আমাদের অ্যাকাউন্ট রেডি, আমরা যেকোনো অন্যান্য ক্লাসের মতো এটি রেফারেন্স করতে পারি। এখানে আমাদের ব্যাংক অ্যাকাউন্টের মধ্যে getBalance() মেথড চালিয়ে আমাদের কত টাকা আছে তা জানার একটি উদাহরণ দেওয়া হল:

print(account.getBalance())

আমাদের প্রোগ্রাম নিম্নলিখিত আউটপুট রিটার্ন করে:

Balance: $ 100

চাইল্ড ক্লাস

উপরোক্ত উদাহরণে, আমরা একটি প্যারেন্ট ক্লাস ডিক্লেয়ার করেছিলাম যা ব্যাংক অ্যাকাউন্ট সংরক্ষণ করে। কিন্তু কি হয় যদি আমরা একটি নির্দিষ্ট টাইপের অ্যাকাউন্টের তথ্য সংরক্ষণ করতে চাই যেমন ১৮ বছরের নিচের একটি চাইল্ডের অন্ডার-১৮ অ্যাকাউন্ট? সেটিই চাইল্ড ক্লাসের কাজ।

চাইল্ড ক্লাস বা সাবক্লাস প্যারেন্ট ক্লাস থেকে মান ইনহেরিট করে। এর মানে হল প্রতিটি চাইল্ড ক্লাস প্যারেন্ট ক্লাসে ডিক্লেয়ার করা মেথড এবং ভেরিয়েবল রেফারেন্স করতে পারবে।

তাহলে, চলুন ধরি আমরা ChildBankAccount এর জন্য একটি চাইল্ড ক্লাস তৈরি করতে চাই। এই অ্যাকাউন্টটি ইউজারের ব্যাংক অ্যাকাউন্ট ইনফরমেশন—তাদের নাম এবং ব্যালেন্স—রিটার্ন করতে পারবে এবং এতে restricted নামে একটি নতুন মানও থাকবে। এই মানটি চাইল্ডের অ্যাকাউন্টে সংরক্ষিত থাকবে কারণ তারা ১৮ বছরের নিচে, এবং পূর্ণ ব্যাংক অ্যাকাউন্টের যোগ্য নয়।

একটি চাইল্ড ক্লাস তৈরি করতে আমরা নিচের কোড ব্যবহার করতে পারি:

class ChildBankAccount(BankAccount):

ChildBankAccount ক্লাসটি BankAccount ক্লাসের চাইল্ড হয়ে যায় কারণ BankAccount প্যারেনথেসিসের ভিতরে অন্তর্ভুক্ত। যদি আমরা চাই আমাদের চাইল্ড ক্লাসের একদম একই মান থাকে প্যারেন্ট ক্লাস—BankAccount—এর মতো, তবে আমরা pass কিওয়ার্ড ব্যবহার করতে পারি এইভাবে:

class ChildBankAccount(BankAccount): pass

কিন্তু আমরা如前েই আলোচনা করেছিলাম, আমাদের চাইল্ড অ্যাকাউন্টে একটি স্পেশাল মান সংরক্ষণ করতে হবে: একটি ভেরিয়েবল যা বলে যে ইউজারের অ্যাকাউন্ট রেস্ট্রিক্টেড।

এই লক্ষ্য অর্জন করতে, আমরা আমাদের চাইল্ড ক্লাসে restricted নামে একটি নতুন মান যোগ করব। আমরা নিচের কোড ব্যবহার করে তা করতে পারি:

class ChildBankAccount(BankAccount):
    def __init__(self, forename, surname, balance, restricted=True):
        self.forename = forename
        self.surname = surname
        self.balance = balance
        self.restricted = restricted
    def isRestricted(self):
        print("This account is restricted as the user is under 18.")

এখন, আমাদের কোডটি ভাঙে ফেলি।

উপরোক্ত কোডে, আমরা বলে দিয়েছি যে আমাদের ChildBankAccounts চারটি মান ধারণ করবে: forename, surname, balance, এবং restricted।

প্রথম তিনটি—forename, surname, এবং balance—আমাদের প্যারেন্ট ক্লাসের মানগুলোর মতোই কিন্তু restricted নতুন, এবং এটি শুধু আমাদের চাইল্ড ক্লাসের জন্য এক্সক্লুসিভ। ডিফল্টভাবে, restricted True সেট করা থাকে।

তাই যদি আমরা একটি স্ট্যান্ডার্ড BankAccount তৈরি করি (নন ChildBankAccount), তবে আমরা restricted মান অ্যাক্সেস করতে পারব না। একইভাবে, আমরা isRestricted মেথডও অ্যাক্সেস করতে পারব না যতক্ষণ না আমরা একটি ChildBankAccount তৈরি করি।

এখানে একটি ChildBankAccount তৈরি করে এবং getBalance() এবং isRestricted() মেথড ব্যবহার করে আমাদের ক্লাস সম্পর্কে জানার একটি উদাহরণ:

child_account = ChildBankAccount("Bill", "Appleseed", 100)
print(child_account.getBalance())
print(child_account.isRestricted())

আমাদের কোড নিম্নলিখিত আউটপুট রিটার্ন করে:

Balance: $ 100
This account is restricted as the user is under 18.

আপনি দেখতে পাচ্ছেন, আমাদের প্রোগ্রাম প্রথমে Bill Appleseed এর জন্য একটি নতুন ChildBankAccount ডিফাইন করে, যাদের অ্যাকাউন্টে $100 রয়েছে। তারপর, আমাদের প্রোগ্রাম আমাদের ক্লাসে getBalance() মেথড এক্সিকিউট করে, যা ইউজারের ব্যালেন্স রিটার্ন করে। getBalance() আমাদের প্যারেন্ট ক্লাস, BankAccount-এ ডিক্লেয়ার করা আছে, কিন্তু ইনহেরিটেন্স মাধ্যমে ChildBankAccount-এ অ্যাক্সেসযোগ্য।

আমাদের প্রোগ্রাম isRestricted() মেথডটিও এক্সিকিউট করে, যা বলে যে চাইল্ডের অ্যাকাউন্ট রেস্ট্রিক্টেড কারণ তিনি ১৮ বছরের নিচে। এই ক্লাস ChildBankAccount-এ ডিক্লেয়ার করা হয়েছে, যার মানে এটি আমাদের প্যারেন্ট ক্লাস BankAccount-এ অ্যাক্সেসযোগ্য নয়। যদি আমরা একটি রেস্ট্রিক্টেড BankAccount তৈরি করতে চাই, তবে আমাদের প্যারেন্ট ক্লাস পরিবর্তন করতে হবে।

প্যারেন্ট মেথড পুনঃনির্বచন

আমাদের উপরের উদাহরণে, আমরা BankAccount নামে একটি প্যারেন্ট ক্লাস ডিক্লেয়ার করেছিলাম যা ব্যাংক অ্যাকাউন্টের জন্য ইনফরমেশন সংরক্ষণ করে। আমরা ChildBankAccount নামে একটি চাইল্ড ক্লাসও তৈরি করেছিলাম যা ১৮ বছরের নিচের অ্যাকাউন্ট হোল্ডারের জন্য ইনফরমেশন সংরক্ষণ করে। এই ক্লাস BankAccount ক্লাস থেকে মেথড ইনহেরিট করেছিল এবং isRestricted() মেথডও তৈরি করেছিল।

কিন্তু কি হয় যদি আমরা একটি বিদ্যমান প্যারেন্ট ক্লাস মেথড মডিফাই করতে চাই? ধরুন আমরা চাই আমাদের BankAccount ব্যালেন্স একটি মেসেজ রিটার্ন करे তাদের ব্যালেন্সের সাথে এবং একটি মেসেজ যে You are eligible for an overdraft, কিন্তু আমরা চাই না এটি ChildBankAccount হোল্ডারদের জন্য দেখানো হয়।

এটি করার জন্য, আমাদের প্যারেন্ট মেথড ওভাররাইড করতে হবে।

এখানে আমাদের রিভাইজড প্যারেন্ট মেথড, BankAccount-এর কোড দেওয়া হল, যা এখন অ্যাকাউন্ট হোল্ডারদের জন্য একটি মেসেজ প্রিন্ট করে যাতে তারা ব্যালেন্স চেক করলে জানেন যে তারা ওভারড্রাফের যোগ্য:

class BankAccount:
    def __init__(self, forename, surname, balance):
        self.forename = forename
        self.surname = surname
        self.balance = balance
    def getDetails(self):
        print("Forename: ", self.forename)
        print("Surname: ", self.surname)
    def getBalance(self):
        print("Balance: $ ", self.balance)
        print("You are eligible for an overdraft.")

এখন, যদি আমরা John Appleseed এর জন্য একটি নতুন BankAccount তৈরি করি এবং তার ব্যালেন্স প্রিন্ট করি, তবে আমরা You are eligible for an overdraft মেসেজটি দেখব। এখানে একটি নতুন অ্যাকাউন্ট ডিক্লেয়ার করে এর ব্যালেন্স চেক করার উদাহরণ:

account = BankAccount("John", "Appleseed", 100)
print(account.getBalance())

আমাদের কোড নিম্নলিখিত আউটপুট রিটার্ন করে:

Balance: $ 100
You are eligible for an overdraft.

কিন্তু এই পরিবর্তনটিও মানে আমাদের ChildBankAccount, যা BankAccount থেকে মান ইনহেরিট করে, সেটিও এই মেসেজটি দেখবে। এখানে একটি ChildBankAccount তৈরি করে এর ব্যালেন্স চেক করার উদাহরণ দেওয়া হল যেহেতু আমাদের BankAccount প্যারেন্ট ক্লাস পরিবর্তন হয়েছে:

child_account = ChildBankAccount("Bill", "Appleseed", 100)
print(child_account.getBalance())

আমাদের কোড রিটার্ন করে:

Balance: $ 100
You are eligible for an overdraft.

যেহেতু বাচ্চাদের সাধারণত ওভারড্রাফ অনুমোদন করা হয় না, আমাদের কোডে একটি পরিবর্তন আনার হবে। এখন, তা করতে হলে, আমাদের ChildBankAccount ক্লাস মডিফাই করতে হবে এবং একটি নতুন getBalance() ফাংশন ডিক্লেয়ার করতে হবে।

এখানে উপরের আমাদের ChildBankAccount এর কোড:

class ChildBankAccount(BankAccount):
    def __init__(self, forename, surname, balance, restricted=True):
        self.forename = forename
        self.surname = surname
        self.balance = balance
        self.restricted = restricted
    def isRestricted(self):
        print("This account is restricted as the user is under 18.")

আমাদের এই কোডটি পরিবর্তন করতে হবে একটি নতুন ফাংশন যোগ করতে: getBalance()। এই ফাংশনটি আমাদের প্যারেন্ট ক্লাসে ডিক্লেয়ার করা একটোর মতোই কাজ করবে, কিন্তু এতে ওভারড্রাফ সম্পর্কে মেসেজ থাকবে না। এখানে আমাদের নতুন ফাংশন ডিক্লেয়ার করার কোড:

...
    def getBalance(self):
        print("Balance: $ ", self.balance)

চলুন এখন আমাদের চাইল্ডের ব্যালেন্স রিট্রিভ করার চেষ্টা করি:

child_account = ChildBankAccount("Bill", "Appleseed", 100)
print(child_account.getBalance())

আমাদের কোড নিম্নলিখিত আউটপুট রিটার্ন করে:

Balance: $ 100

উপরোক্ত উদাহরণে, আমরা ChildBankAccount চাইল্ড ক্লাসে getBalance() মেথড ওভাররাইট করেছি। ChildBankAccount এর জন্য আমাদের নতুন getBalance() মেথড শুধু ইউজারের ব্যালেন্স দেখায়। কিন্তু আমাদের BankAccount ক্লাসে, getBalance() মেথড ইউজারের ব্যালেন্স এবং You are eligible for an overdraft মেসেজ দুটোই দেখায়।

প্যারেন্ট মেথড ওভাররাইড করা তখন কার্যকর হয় যখন আপনার একাধিক চাইল্ড মেথড থাকে যেগুলো তাদের প্যারেন্টের মতো সমান মেথড ব্যবহার করতে পারে, কিন্তু তাদের নিজস্ব নির্দিষ্ট পরিবর্তন আনার প্রয়োজন হয়। উপরের কেসের মতো, আমরা চাই আমাদের প্যারেন্ট ব্যাংক অ্যাকাউন্ট ওভারড্রাফ মেসেজ দেখে, কিন্তু আমাদের চাইল্ড ব্যাংক অ্যাকাউন্ট না দেখে, তাই আমরা ChildBankAccount-এ আমাদের প্যারেন্ট মেথড ওভাররাইড করেছি।

উপসংহার

অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং-এ ইনহেরিটেন্স ব্যবহার করা হয় যাতে আপনি সাবক্লাস তৈরি করতে পারেন যা প্যারেন্ট ক্লাসে ইতিমধ্যে ডিক্লেয়ার করা মান সংরক্ষণ করতে পারে। এটি তখন উপযোগী হয় যখন আপনি সমান ক্লাস তৈরি করছেন যা সমান মান সংরক্ষণ করবে কারণ আপনি ইনহেরিটেন্স ব্যবহার করে সেই ক্লাসগুলো তৈরি করতে পারেন আপনার কোড একাধিকবার রিপিট না করে।

এই টিউটোরিয়ালে, আমরা পাইথনে ইনহেরিটেন্সের ভূমিকা এক্সপ্লোর করেছি। আমরা ইনহেরিটেন্স এবং প্যারেন্ট ও চাইল্ড ক্লাস কীভাবে কাজ করে সেটাও আলোচনা করেছি, তারপর আমরা প্যারেন্ট মেথড কীভাবে ওভাররাইড করতে হয় সেটাও এক্সপ্লোর করেছি। এখন আপনি ক্লাস এবং ইনহেরিটেন্স পাইথন এক্সপার্টের মতো কাজ করার জন্য রেডি!

  1. পাইথন ইন্টারপ্রেটার: ধাপে ধাপে গাইড

  2. পাইথনে ফাইল রিনেম: একটি ধাপে ধাপে গাইড

  3. পাইথনে ক্লাস ইনহেরিটেন্স (Class Inheritance)

  4. পাইথনে ইনহেরিটেন্স (Inheritance)