পাইথন ইনহেরিটেন্স হল যখন একটি সাবক্লাস অন্য ক্লাস থেকে কোড ব্যবহার করে। পাইথনের মতো অবজেক্ট-ওরিয়েন্টেড ভাষায় উত্তরাধিকার একটি অপরিহার্য বৈশিষ্ট্য যা কোডিংকে সহজ এবং আরও দক্ষ করে তোলে।
পাইথন একটি অবজেক্ট-ভিত্তিক ভাষা, যার মানে এটি কোডকে আরও দক্ষ করে তুলতে সাহায্য করার জন্য কোডের পুনরায় ব্যবহারযোগ্য ব্লক তৈরি করতে সহায়তা করে। এটি ঘটে এমন একটি উপায় হল উত্তরাধিকারের মাধ্যমে, যেখানে একটি সাবক্লাস অন্য ক্লাস থেকে কোড ব্যবহার করতে পারে।
উদাহরণস্বরূপ, আপনার এমন একটি ক্লাস থাকতে পারে যা "ব্যাঙ্ক অ্যাকাউন্ট" সঞ্চয় করে এবং একটি উপশ্রেণী তৈরি করতে চান যা "গোল্ড ব্যাঙ্ক অ্যাকাউন্ট" সঞ্চয় করে যা বিদ্যমান "ব্যাঙ্ক অ্যাকাউন্ট" শ্রেণীতে বৈশিষ্ট্য উল্লেখ করতে পারে।
এই টিউটোরিয়ালে, আমরা পাইথনের উত্তরাধিকারের মূল বিষয়গুলি ভেঙে দিতে যাচ্ছি। অভিভাবক এবং শিশু পাইথন ক্লাসগুলি কীভাবে কাজ করে এবং আপনি যখন ক্লাস অবজেক্টের সাথে কাজ করছেন তখন কীভাবে বৈশিষ্ট্যগুলি ও পদ্ধতিগুলিকে ওভাররাইড করা যায় তা নিয়েও আমরা আলোচনা করতে যাচ্ছি৷
পাইথন ইনহেরিটেন্স
উত্তরাধিকার এমন একটি শব্দ যা অন্য শ্রেণীর মধ্যে একটি পাইথন শ্রেণীকে বর্ণনা করতে ব্যবহৃত হয়। subclasses
নামে ক্লাস অথবা child classes
parent classes
থেকে মান উত্তরাধিকার সূত্রে পেতে পারে , বাস্তব জগতে শিশুরা কীভাবে তাদের পিতামাতার কাছ থেকে বৈশিষ্ট্যগুলি উত্তরাধিকার সূত্রে পেয়ে থাকে।
উত্তরাধিকার উপযোগী কারণ এটি আমাদের subclasses
তৈরি করতে দেয় যেগুলির মানগুলির ধরনগুলি অভিভাবক শ্রেণীর হিসাবে একই রকম রয়েছে, সেই প্রকারগুলিকে একাধিকবার ঘোষণা না করেই৷
অভিভাবক ক্লাস
অভিভাবক ক্লাস (একে base classes
ও বলা হয় মাস্টার স্ট্রাকচার তৈরি করুন যা সাবক্লাস অ্যাক্সেস করতে পারে। অভিভাবক শ্রেণী থেকে প্রাপ্ত শ্রেণী পদ্ধতিগুলিকে পুনরায় একই সাধারণ মানগুলির সেট ঘোষণা না করেই আমরা একাধিক সাবক্লাস তৈরি করতে পারি৷
এটি কীভাবে কাজ করবে তা বোঝাতে একটি উদাহরণ ব্যবহার করা যাক। বলুন যে আমাদের একটি প্রোগ্রাম ছিল যা দুটি ভিন্ন ধরনের ব্যাঙ্ক অ্যাকাউন্টের সাথে কাজ করে:পিতামাতা এবং শিশু৷
৷81% অংশগ্রহণকারী বলেছেন যে তারা বুটক্যাম্পে যোগ দেওয়ার পরে তাদের প্রযুক্তিগত কাজের সম্ভাবনা সম্পর্কে আরও আত্মবিশ্বাসী বোধ করেছেন। আজই একটি বুটক্যাম্পের সাথে মিলিত হন৷
৷গড় বুটক্যাম্প গ্র্যাড একটি বুটক্যাম্প শুরু করা থেকে শুরু করে তাদের প্রথম চাকরি খোঁজা পর্যন্ত ক্যারিয়ারের পরিবর্তনে ছয় মাসেরও কম সময় ব্যয় করেছে।
এই উভয় অ্যাকাউন্টই ব্যাঙ্ক অ্যাকাউন্ট, এবং তাই তাদের একই মান থাকবে। কিন্তু এই অ্যাকাউন্টগুলির প্রতিটির নিজস্ব অনন্য তথ্যের প্রয়োজন হতে পারে। উদাহরণস্বরূপ, একজন পিতামাতার অ্যাকাউন্ট একটি ওভারড্রাফ্ট সমর্থন করতে পারে, যেখানে সন্তানের অ্যাকাউন্ট শুধুমাত্র তাদের ব্যালেন্সের সাথে কাজ করতে পারে।
সুতরাং, যদি আমরা এই মানগুলির সাথে একটি প্রোগ্রাম তৈরি করতে চাই, আমরা প্রথমে আমাদের ব্যাঙ্ক অ্যাকাউন্টের জন্য একটি শ্রেণী নির্ধারণ করব (একটি অভিভাবক শ্রেণী) তারপরে দুটি ধরণের ব্যাঙ্ক অ্যাকাউন্টের জন্য চাইল্ড ক্লাস তৈরি করব - পিতামাতা এবং শিশু - যা আমরা সমর্থন করতে চাই৷
এখানে একটি ব্যাঙ্ক অ্যাকাউন্টের জন্য অভিভাবক শ্রেণী ঘোষণা করার একটি উদাহরণ:
class BankAccount: def __init__(self, forename, surname, balance): self.forename = forename self.surname = surname self.balance = balance
আমরা 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)
আমাদের ক্লাস এখন তিনটি মান সঞ্চয় করে, পাশাপাশি দুটি নতুন পদ্ধতি:বিবরণ এবং ভারসাম্য। details
পদ্ধতিটি আমাদের অ্যাকাউন্টধারীর পূর্বনাম এবং উপাধি এবং balance
খুঁজে বের করতে ব্যবহার করা যেতে পারে পদ্ধতি অ্যাকাউন্টধারীর ব্যালেন্স ফেরত দেবে।
প্রতিটি পদ্ধতি এবং পরিবর্তনশীল যা আমরা আমাদের BankAccount
-এ ঘোষণা করি ক্লাস আমাদের চাইল্ড ক্লাসে অ্যাক্সেসযোগ্য হবে।
আমাদের শ্রেণীটি কর্মে তুলে ধরার জন্য, আসুন একটি উদাহরণ ব্যাঙ্ক অ্যাকাউন্ট তৈরি করি। আমরা নিম্নলিখিত কোড ব্যবহার করে তা করতে পারি:
account = BankAccount("John", "Appleseed", 100)
এটি John Appleseed
-এর জন্য একটি অ্যাকাউন্ট তৈরি করবে যার মধ্যে $100 রয়েছে। এখন যেহেতু আমাদের অ্যাকাউন্ট প্রস্তুত আছে, আমরা অন্য কোনো ক্লাসের মতো এটিকে উল্লেখ করা শুরু করতে পারি। এখানে আমাদের getBalance()
চালানোর একটি উদাহরণ দেওয়া হল আমাদের ব্যাঙ্ক অ্যাকাউন্টের মধ্যে আমাদের কত টাকা আছে তা খুঁজে বের করার পদ্ধতি:
print(account.getBalance())
আমাদের প্রোগ্রাম নিম্নলিখিত প্রদান করে:
Balance: $ 100
শিশু ক্লাস
উপরের উদাহরণে, আমরা একটি অভিভাবক শ্রেণী ঘোষণা করেছি যা ব্যাঙ্ক অ্যাকাউন্ট সংরক্ষণ করে। কিন্তু আমরা যদি 18 বছরের কম বয়সী শিশুর অ্যাকাউন্টের মতো একটি নির্দিষ্ট ধরনের অ্যাকাউন্ট সম্পর্কে তথ্য সংরক্ষণ করতে চাই তাহলে কী হবে? সেখানেই চাইল্ড ক্লাস আসে।
চাইল্ড ক্লাস, বা সাবক্লাস, প্যারেন্ট ক্লাস থেকে মান উত্তরাধিকারসূত্রে প্রাপ্ত হয়। এর মানে হল যে প্রতিটি শিশু শ্রেণি আমাদের অভিভাবক শ্রেণিতে আমরা যে পদ্ধতি এবং ভেরিয়েবল ঘোষণা করি সেগুলি উল্লেখ করতে সক্ষম হবে৷
তাই, ধরা যাক যে আমরা একটি ChildBankAccount
-এর জন্য একটি চাইল্ড ক্লাস তৈরি করতে চাই . এই অ্যাকাউন্টটি একজন ব্যবহারকারীর ব্যাঙ্ক অ্যাকাউন্টের তথ্য-তাদের নাম এবং ব্যালেন্স ফেরত দিতে সক্ষম হওয়া উচিত-এবং restricted
নামে একটি নতুন মান থাকা উচিত। . এই মানটি একটি সন্তানের অ্যাকাউন্টে সংরক্ষণ করা হবে কারণ তারা 18 বছরের কম বয়সী, এবং সম্পূর্ণ ব্যাঙ্ক অ্যাকাউন্টের জন্য যোগ্য নয়।
একটি চাইল্ড ক্লাস তৈরি করার জন্য, আমরা নিম্নলিখিত কোডটি ব্যবহার করতে পারি:
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.")
এখন, আসুন আমাদের কোড ভাঙ্গা যাক।
উপরের কোডে, আমরা বলেছি যে আমরা চাই আমাদের চাইল্ডব্যাঙ্ক অ্যাকাউন্টে চারটি মান থাকবে:পূর্বনাম, উপাধি, ব্যালেন্স এবং সীমাবদ্ধ৷
প্রথম তিনটি—পুরনাম, উপাধি এবং ভারসাম্য—আমাদের অভিভাবক শ্রেণীর মানগুলির মতই কিন্তু restricted
নতুন, এবং এটি আমাদের শিশু শ্রেণীর জন্য একচেটিয়া। ডিফল্টরূপে, restricted
True
এ সেট করা আছে .
তাই যদি আমরা একটি স্ট্যান্ডার্ড BankAccount
তৈরি করি (কোনও ChildBankAccount
নয় ), আমরা restricted
অ্যাক্সেস করতে পারব না মান একইভাবে, আমরা isRestricted
অ্যাক্সেস করতে পারব না পদ্ধতি যদি না আমরা একটি ChildBankAccount
তৈরি করি .
এখানে একটি ChildBankAccount
তৈরি করার উদাহরণ দেওয়া হল এবং getBalance()
ব্যবহার করে এবং isResticted()
আমাদের ক্লাস সম্পর্কে আরও জানার পদ্ধতি:
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.
আপনি দেখতে পাচ্ছেন, আমাদের প্রোগ্রাম প্রথমে একটি নতুন ChildBankAccount
সংজ্ঞায়িত করে Bill Appleseed
এর জন্য , যার অ্যাকাউন্টে $100 আছে। তারপর, আমাদের প্রোগ্রাম getBalance()
চালায় আমাদের ক্লাসের পদ্ধতি, যা ব্যবহারকারীর ব্যালেন্স ফেরত দেয়। getBalance()
আমাদের অভিভাবক শ্রেণীতে ঘোষণা করা হয়েছে, BankAccount
, কিন্তু ChildBankAccount
-এ অ্যাক্সেসযোগ্য উত্তরাধিকার এর মাধ্যমে .
আমাদের প্রোগ্রাম isRestricted()
ও চালায় পদ্ধতি, যা বলে যে শিশুর অ্যাকাউন্ট সীমিত করা হয়েছে কারণ তাদের বয়স 18 বছরের কম। এই ক্লাসটি ChildBankAccount
-এ ঘোষণা করা হয়েছে , যদিও, যার মানে হল এটি আমাদের অভিভাবক শ্রেণীর BankAccount
-এ অ্যাক্সেসযোগ্য নয় . যদি আমরা একটি সীমাবদ্ধ BankAccount
তৈরি করতে চাই , আমাদের প্যারেন্ট ক্লাস পরিবর্তন করতে হবে।
অভিভাবক পদ্ধতি পুনঃসংজ্ঞায়িত করা
আমাদের উপরের উদাহরণে, আমরা BankAccount
নামে একটি অভিভাবক শ্রেণি ঘোষণা করেছি যা ব্যাঙ্ক অ্যাকাউন্টের তথ্য সংরক্ষণ করে। আমরা ChildBankAccount
নামে একটি চাইল্ড ক্লাসও তৈরি করেছি যা 18 বছরের কম বয়সী অ্যাকাউন্টধারীদের জন্য তথ্য সঞ্চয় করে। এই শ্রেণীটি 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.")
এখন, যদি আমরা একটি নতুন BankAccount
তৈরি করি John Appleseed
-এর জন্য এবং তার ব্যালেন্স প্রিন্ট করুন, আমরা 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
উপরের উদাহরণে, আমরা getBalance()
ওভাররাইট করেছি ChildBankAccount
-এ পদ্ধতি শিশু শ্রেণী। আমাদের নতুন getBalance()
ChildBankAccount
এর জন্য পদ্ধতি শুধুমাত্র ব্যবহারকারীর ব্যালেন্স দেখায়। কিন্তু আমাদের BankAccount
-এ ক্লাস, getBalance()
পদ্ধতি ব্যবহারকারীর ব্যালেন্স এবং বার্তা উভয়ই দেখায় You are eligible for an overdraft
.
ওভাররাইডিং অভিভাবক পদ্ধতিগুলি উপযোগী হতে পারে যখন আপনার একাধিক শিশু পদ্ধতি থাকে যা তাদের পিতামাতার অনুরূপ পদ্ধতি ব্যবহার করতে পারে, কিন্তু তাদের নিজস্ব নির্দিষ্ট পরিবর্তন করতে হবে। উপরের ক্ষেত্রের মতো, আমরা চাই যে আমাদের পিতামাতার ব্যাঙ্ক অ্যাকাউন্টগুলি একটি ওভারড্রাফ্ট বার্তা দেখুক, কিন্তু আমাদের চাইল্ড ব্যাঙ্ক অ্যাকাউন্ট নয়, তাই আমরা ChildBankAccount
-এ আমাদের অভিভাবক পদ্ধতি ওভাররড করেছি .
উপসংহার
অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং-এ উত্তরাধিকার ব্যবহার করা হয় যাতে আপনি এমন সাবক্লাস তৈরি করতে পারেন যা ইতিমধ্যেই অভিভাবক শ্রেণীতে ঘোষিত মান সঞ্চয় করতে পারে। এটি উপযোগী যখন আপনি একই ধরনের ক্লাস তৈরি করছেন যা একই মান সঞ্চয় করবে কারণ আপনি আপনার কোড একাধিকবার পুনরাবৃত্তি না করে সেই ক্লাসগুলি তৈরি করতে উত্তরাধিকার ব্যবহার করতে পারেন।
এই টিউটোরিয়ালে, আমরা পাইথনে উত্তরাধিকারের ভূমিকা অন্বেষণ করেছি। আমরা আরও আলোচনা করেছি কিভাবে উত্তরাধিকার এবং পিতামাতা এবং শিশু শ্রেণীগুলি কাজ করে, তারপর আমরা কীভাবে অভিভাবক পদ্ধতিগুলিকে ওভাররাইড করতে হয় তা অনুসন্ধান করেছি৷ এখন আপনি পাইথন বিশেষজ্ঞের মতো ক্লাস এবং উত্তরাধিকার নিয়ে কাজ করতে প্রস্তুত!