Python Inheritance

পাইথন উত্তরাধিকার শিখুন

পাইথন - উত্তরাধিকার

উত্তরাধিকার এমন একটি শ্রেণীকে সংজ্ঞায়িত করার অনুমতি দেয় যা অন্য শ্রেণীর থেকে সমস্ত পদ্ধতি এবং বৈশিষ্ট্য উত্তরাধিকারসূত্রে পায়।

অভিভাবক শ্রেণী

নাম:অভিভাবক শ্রেণী/বেস ক্লাস

কার্যকলাপ:উত্তরাধিকারসূত্রে প্রাপ্ত

উদাহরণ:ব্যক্তি শ্রেণী

শিশু শ্রেণী

নাম:চাইল্ড ক্লাস/ডিরাইভড ক্লাস

কার্যকলাপ:উত্তরাধিকারসূত্রে

উদাহরণ:ছাত্র শ্রেণী

একটি অভিভাবক ক্লাস তৈরি করা হচ্ছে

যেকোন ক্লাস একটি প্যারেন্ট ক্লাস হতে পারে, তাই সিনট্যাক্স অন্য যেকোন ক্লাস তৈরি করার মতই:

উদাহরণ

ব্যক্তি নামে একটি শ্রেণী তৈরি করুন, প্রথম নাম এবং শেষ নাম বৈশিষ্ট্য সহ, এবং একটি প্রিন্টনাম পদ্ধতি:

শ্রেণীর ব্যক্তি: 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() # প্রতিটি বিভাগের জন্য সঠিক শব্দ # আউটপুট: উফ! #ম্যাও!

অনুশীলন করুন

ত্রুটি এড়াতে একটি খালি ক্লাসের ভিতরে ব্যবহার করার জন্য সঠিক কীওয়ার্ড কী?

অনুশীলন প্রশ্ন:

empty
✗ ভুল! পাইথনেemptyকোন কীওয়ার্ড নেই। খালি ব্লকের জন্যpassব্যবহার করা হয়
inherit
✗ ভুল!inheritপাইথন কীওয়ার্ড নয়। খালি ক্লাসের জন্যpassব্যবহার করা হয়, আমরা উত্তরাধিকারের জন্য বন্ধনীতে ক্লাসের নামগুলি আবদ্ধ করি।
pass
✓ ঠিক আছে!passকীওয়ার্ডটি খালি ক্লাস এবং ফাংশনের জন্য ব্যবহৃত হয়। এটি পাইথনকে "এখানে কিছুই না করতে" বলে, যা সিনট্যাক্স ত্রুটি এড়ায়।

সর্বোত্তম অনুশীলন

উত্তরাধিকারী হতেsuper()ব্যবহার করুন:অভিভাবক শ্রেণীর নাম পরিবর্তন হলে কোড আপডেট করার প্রয়োজন নেই
শুধুমাত্র সম্পর্কিত ক্লাসের জন্য উত্তরাধিকার ব্যবহার করুন:"একটি" সম্পর্ক পরীক্ষা করুন (ছাত্র একজন ব্যক্তি)
প্যারেন্ট ক্লাসে জেনেরিক ফাংশন রাখুন:কোড পুনঃব্যবহার বাড়ায়
খুব গভীর উত্তরাধিকার চেইন এড়িয়ে চলুন:রক্ষণাবেক্ষণ 2-3 স্তরের বাইরে কঠিন
টাইপ চেক করার জন্যisinstance()ব্যবহার করুন: type()পরিবর্তে, এটি একাউন্টে সাবক্যাটাগরিগুলো নেয়
কার্যকরী ওভাররাইড নথিভুক্ত করুন:নথি যা অভিভাবক ফাংশন ওভাররাইড করা হয়