পাইথন - উত্তরাধিকার
উত্তরাধিকার এমন একটি শ্রেণীকে সংজ্ঞায়িত করার অনুমতি দেয় যা অন্য শ্রেণীর থেকে সমস্ত পদ্ধতি এবং বৈশিষ্ট্য উত্তরাধিকারসূত্রে পায়।
অভিভাবক শ্রেণী
নাম:অভিভাবক শ্রেণী/বেস ক্লাস
কার্যকলাপ:উত্তরাধিকারসূত্রে প্রাপ্ত
উদাহরণ:ব্যক্তি শ্রেণী
শিশু শ্রেণী
নাম:চাইল্ড ক্লাস/ডিরাইভড ক্লাস
কার্যকলাপ:উত্তরাধিকারসূত্রে
উদাহরণ:ছাত্র শ্রেণী
একটি অভিভাবক ক্লাস তৈরি করা হচ্ছে
যেকোন ক্লাস একটি প্যারেন্ট ক্লাস হতে পারে, তাই সিনট্যাক্স অন্য যেকোন ক্লাস তৈরি করার মতই:
উদাহরণ
ব্যক্তি নামে একটি শ্রেণী তৈরি করুন, প্রথম নাম এবং শেষ নাম বৈশিষ্ট্য সহ, এবং একটি প্রিন্টনাম পদ্ধতি:
শ্রেণীর ব্যক্তি: def __init__(self, fname, lname): self.firstname = fname self.lastname = lname def প্রিন্টনাম(স্ব): প্রিন্ট (self.firstname, self.lastname) # ব্যক্তি শ্রেণী ব্যবহার করে একটি অবজেক্ট তৈরি করুন, তারপর প্রিন্টনাম পদ্ধতিটি চালু করুন: x = ব্যক্তি("জন", "ডো") x.printname() # আউটপুট: জন ডো
শ্রেণী গঠন:
ক্লাসের নাম: Person
বৈশিষ্ট্য: firstname, lastname
পদ্ধতি: __init__(), printname()
আবেদন:সাধারণ ব্যক্তির ডেটা পরিচালনা
একটি শিশু ক্লাস তৈরি করা
অন্য ক্লাস থেকে কার্যকারিতা উত্তরাধিকারসূত্রে প্রাপ্ত একটি ক্লাস তৈরি করতে, চাইল্ড ক্লাস তৈরি করার সময় প্যারামিটার হিসাবে প্যারেন্ট ক্লাস পাস করুন:
উদাহরণ
স্টুডেন্ট নামে একটি ক্লাস তৈরি করুন যা ব্যক্তি শ্রেণীর থেকে বৈশিষ্ট্য এবং পদ্ধতিগুলি উত্তরাধিকারসূত্রে পায়:
শ্রেণীর ছাত্র (ব্যক্তি): পাস # স্টুডেন্ট ক্লাস ব্যবহার করে একটি অবজেক্ট তৈরি করুন, তারপর প্রিন্টনাম পদ্ধতিটি চালু করুন: x = ছাত্র("মাইক", "ওলসেন") x.printname() # আউটপুট: মাইক ওলসেন
দ্রষ্টব্য:
যখন আপনি ক্লাসে অন্য কোনো বৈশিষ্ট্য বা পদ্ধতি যোগ করতে চান নাpassকীওয়ার্ড ব্যবহার করুন।
উত্তরাধিকার প্রবাহ:
অভিভাবক শ্রেণী: Person
→ প্রাপ্ত:প্রথম নাম, শেষ নাম (গুণাবলী)
→ প্রাপ্ত:__init__(), printname() (পদ্ধতি)
শিশু শ্রেণী: Student
বর্তমান অবস্থা:ব্যক্তির সমস্ত বৈশিষ্ট্য এবং পদ্ধতি
__init__()কার্যকারিতা যোগ করা হচ্ছে
এখন পর্যন্ত আমরা একটি শিশু শ্রেণী তৈরি করেছি যা তার পিতামাতার কাছ থেকে বৈশিষ্ট্য এবং পদ্ধতিগুলি উত্তরাধিকার সূত্রে পায়।
শিশু শ্রেণিতে (passকীওয়ার্ডের পরিবর্তে)__init__()আমরা কার্যকারিতা যোগ করতে চান.
দ্রষ্টব্য:
__init__()ফাংশন ক্লাস স্বয়ংক্রিয়ভাবে কল করা হয় যখন এটি একটি নতুন বস্তু তৈরি করতে ব্যবহৃত হয়।
চাইল্ড ক্লাসে __init__() যোগ করা হচ্ছে
শ্রেণীর ছাত্র (ব্যক্তি): def __init__(self, fname, lname): # বৈশিষ্ট্য যোগ করুন ইত্যাদি পাস
সমস্যা:পিতামাতার __init__() থেকে উত্তরাধিকার হারিয়ে গেছে
উপসংহার:প্রথম নাম, শেষ নাম আরম্ভ করা হয়নি
একটি বৈধ __init__() ফাংশন
শ্রেণীর ছাত্র (ব্যক্তি): def __init__(self, fname, lname): ব্যক্তি.__init__(স্ব, নাম, নাম) # অতিরিক্ত সূচনা
সমাধান:পিতামাতার __init__() কে স্পষ্টভাবে কল করুন
উপসংহার:firstname, lastname সঠিকভাবে শুরু করা হয়েছে
গুরুত্বপূর্ণ নোট:
সন্তানের__init__()ফাংশন অভিভাবক__init__()ফাংশন উত্তরাধিকার ওভাররাইড করে।
super()ফাংশন ব্যবহার করে
একটি পাইথন চাইল্ড ক্লাস তার পিতামাতার কাছ থেকে সমস্ত পদ্ধতি এবং বৈশিষ্ট্য উত্তরাধিকারসূত্রে পায়super()এছাড়াও কার্যকারিতা অন্তর্ভুক্ত:
শ্রেণীর ছাত্র (ব্যক্তি): def __init__(self, fname, lname): সুপার().__init__(fname, lname) # অতিরিক্ত সূচনা
কল খুলুন
class Student(Person):
def __init__(self, fname, lname):
Person.__init__(self, fname, lname)
পদ্ধতি:অভিভাবক শ্রেণীর নাম নির্দিষ্ট করে
সুবিধা:পরিষ্কার
অসুবিধা:পিতামাতার নাম পরিবর্তন করা উচিত
super() ইউটিলিটি
class Student(Person):
def __init__(self, fname, lname):
super().__init__(fname, lname)
পদ্ধতি:অভিভাবক শ্রেণীর নাম নির্দিষ্ট করে না
সুবিধা:রক্ষণাবেক্ষণ সহজ
অসুবিধা:কম স্পষ্ট
টিপ:
super()একটি ফাংশন ব্যবহার করে, আপনাকে মূল উপাদানটির নাম ব্যবহার করার দরকার নেই, এটি স্বয়ংক্রিয়ভাবে তার পিতামাতার থেকে পদ্ধতি এবং বৈশিষ্ট্যগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হয়।
বৈশিষ্ট্য যোগ করা হচ্ছে
উদাহরণ 1: স্থির বৈশিষ্ট্য
শ্রেণীর ছাত্র (ব্যক্তি): def __init__(self, fname, lname): সুপার().__init__(fname, lname) self.graduationyear = 2019 # ধ্রুবক বছর x = ছাত্র("মাইক", "ওলসেন") print(x.graduationyear) # আউটপুট: 2019 print(x.firstname) # আউটপুট: মাইক print(x.lastname) # আউটপুট: Olsen
উদাহরণ 2: পরিবর্তনশীল সম্পত্তি
শ্রেণীর ছাত্র (ব্যক্তি): def __init__(স্ব, fname, lname, year): সুপার().__init__(fname, lname) self.graduationyear = বছর # পরিবর্তনশীল বছর x = ছাত্র("মাইক", "ওলসেন", 2019) print(x.graduationyear) # আউটপুট: 2019 y = ছাত্র("আন্না", "স্মিথ", 2020) প্রিন্ট(y.graduationyear) # আউটপুট: 2020
উত্তরাধিকার সম্প্রসারণ:
পিতামাতার বৈশিষ্ট্য: firstname, lastname
শিশুর বৈশিষ্ট্য:স্নাতক বছর (নতুন!)
সামগ্রিক বৈশিষ্ট্য: firstname, lastname, graduationyear
প্রাপ্ত:পিতামাতার কাছ থেকে
যোগ করা হয়েছে:শিশুর মধ্যে নতুন
পদ্ধতি যোগ করা
উদাহরণ
ছাত্র ক্লাসে একটি স্বাগত পদ্ধতি যোগ করুন:
শ্রেণীর ছাত্র (ব্যক্তি): def __init__(স্ব, fname, lname, year): সুপার().__init__(fname, lname) self.graduationyear = বছর def স্বাগতম (স্বাগত): মুদ্রণ("স্বাগত", স্ব.প্রথম নাম, স্ব.শেষ নাম, "এর ক্লাসে", self.graduation year) # আবেদন x = ছাত্র("মাইক", "ওলসেন", 2019) x.printname() # পদ্ধতি থেকে উদ্ভূত: মাইক ওলসেন x.welcome() # নতুন পদ্ধতি: মাইক ওলসেনকে 2019-এর ক্লাসে স্বাগতম
পদ্ধতি ওভাররাইড:
যদি একটি শিশু শ্রেণি অভিভাবক শ্রেণিতে একটি ফাংশনের মতো একই নামের একটি পদ্ধতি যোগ করে, তাহলে অভিভাবক পদ্ধতির উত্তরাধিকার ওভাররাইড করা হয়।
শ্রেণীর ব্যক্তি: def ভূমিকা (স্ব): মুদ্রণ ("আমি একজন ব্যক্তি") শ্রেণীর ছাত্র (ব্যক্তি): def introduction(self): # প্যারেন্ট পদ্ধতি ওভাররাইড করে মুদ্রণ ("আমি একজন ছাত্র") x = ছাত্র() x.introduction() # আউটপুট: আমি একজন ছাত্র (অভিভাবক পদ্ধতি নয়)
উত্তরাধিকারের একাধিক স্তর
শ্রেণীর ব্যক্তি: def __init__(নিজে, নাম, বয়স): self.name = নাম self.age = বয়স def পরিচয় (স্বয়ং): প্রিন্ট (f"আমি {self.name}, {self.age} বছর বয়সী") শ্রেণীর ছাত্র (ব্যক্তি): def __init__(স্ব, নাম, বয়স, ছাত্র_আইডি): super().__init__(নাম, বয়স) self.student_id = student_id ডিএফ অধ্যয়ন (স্ব): প্রিন্ট (f"{self.name} পড়াশোনা করছে") শ্রেণী স্নাতক (ছাত্র): def __init__(স্ব, নাম, বয়স, ছাত্র_আইডি, গবেষণা_বিষয়): super().__init__(নাম, বয়স, ছাত্র_আইডি) self.research_topic = গবেষণা_বিষয় ডিএফ গবেষণা (স্ব): print(f"{self.name} গবেষণা করছে {self.research_topic}") # আবেদন grad_student = স্নাতক ছাত্র("এলিস", 25, "S12345", "AI") grad_student.introduce() # থেকে প্রাপ্ত: ব্যক্তি grad_student.study() # থেকে প্রাপ্ত: ছাত্র grad_student.research() # নতুন: গ্র্যাজুয়েট স্টুডেন্টে
উত্তরাধিকারের চেইন:
লেভেল 1:ব্যক্তি (বেস ক্লাস)
→ প্রাপ্ত: name, age, introduce()
লেভেল 2:ছাত্র (ব্যক্তি থেকে প্রাপ্ত)
→ প্রাপ্ত:সমস্ত ব্যক্তি + ছাত্র_আইডি, অধ্যয়ন()
লেভেল 3:স্নাতক ছাত্র (ছাত্র থেকে প্রাপ্ত)
→ প্রাপ্ত:সমস্ত ছাত্র + গবেষণা_বিষয়, গবেষণা()
একটি বাস্তব উদাহরণ
# অভিভাবক শ্রেণী: যানবাহন শ্রেণীর যানবাহন: def __init__(স্ব, ব্র্যান্ড, মডেল, বছর): self.brand = ব্র্যান্ড self.model = মডেল self.year = বছর def start(self): প্রিন্ট (f"{self.brand} {self.model} শুরু হচ্ছে...") def stop(self): প্রিন্ট (f"{self.brand} {self.model} থামছে...") # শিশু ক্লাস 1: গাড়ি ক্লাস কার (যানবাহন): def __init__(স্ব, ব্র্যান্ড, মডেল, বছর, দরজা): super().__init__(ব্র্যান্ড, মডেল, বছর) self.doors = দরজা def honk(self): প্রিন্ট (f"{self.brand} {self.model} honking!") # চাইল্ড ক্লাস 2: মোটরসাইকেল শ্রেণীর মোটরসাইকেল (যানবাহন): def __init__(স্ব, ব্র্যান্ড, মডেল, বছর, has_sidecar): super().__init__(ব্র্যান্ড, মডেল, বছর) self.has_sidecar = has_sidecar def হুইলি (স্বয়ং): প্রিন্ট (f"{self.brand} {self.model} একটি হুইলি করছে!") # আবেদন my_car = গাড়ি("টয়োটা", "ক্যামরি", 2020, 4) my_car.start() # প্রাপ্ত: Toyota Camry শুরু হচ্ছে... my_car.honk() # নতুন: Toyota Camry honking! my_bike = মোটরসাইকেল("হারলে", "ডেভিডসন", 2019, মিথ্যা) my_bike.start() # গৃহীত: হার্লে ডেভিডসন শুরু হচ্ছে... my_bike.wheelie() # নতুন: হার্লে ডেভিডসন হুইলি করছে!
টাইপ চেকিং এবংisinstance()
শ্রেণীর প্রাণী: def __init__(স্ব, নাম): self.name = নাম def কথা (স্বয়ং): মুদ্রণ ("পশুর শব্দ") শ্রেণীর কুকুর (প্রাণী): def কথা (স্বয়ং): মুদ্রণ ("উফ!") ক্লাস বিড়াল (প্রাণী): def কথা (স্বয়ং): প্রিন্ট ("ম্যাও!") # সম্পর্ক যাচাই করা কুকুর = কুকুর ("বন্ধু") বিড়াল = বিড়াল("হুসকার") মুদ্রণ(ইসিস্ট্যান্স(কুকুর, কুকুর)) # সত্য print(isinstance(কুকুর, প্রাণী)) # সত্য (কুকুর প্রাণীর একটি উপশ্রেণী) মুদ্রণ(ইসিস্ট্যান্স(কুকুর, বিড়াল)) # মিথ্যা মুদ্রণ(isinstance(cat, Cat)) # সত্য print(isinstance(cat, Animal)) # সত্য (বিড়াল প্রাণীর একটি উপশ্রেণী) #বৈচিত্র্য প্রাণী = [কুকুর, বিড়াল] প্রাণীদের মধ্যে প্রাণীদের জন্য: animal.speak() # প্রতিটি বিভাগের জন্য সঠিক শব্দ # আউটপুট: উফ! #ম্যাও!
অনুশীলন করুন
ত্রুটি এড়াতে একটি খালি ক্লাসের ভিতরে ব্যবহার করার জন্য সঠিক কীওয়ার্ড কী?
অনুশীলন প্রশ্ন:
সর্বোত্তম অনুশীলন
super()ব্যবহার করুন:অভিভাবক শ্রেণীর নাম পরিবর্তন হলে কোড আপডেট করার প্রয়োজন নেইisinstance()ব্যবহার করুন: type()পরিবর্তে, এটি একাউন্টে সাবক্যাটাগরিগুলো নেয়