মূল কন্টেন্টে যান
মডিউল 7 · 2-এর পাঠ 4কোর্সে 26/36~12 min
মডিউল পাঠ (2/4)

উত্তরাধিকার

উত্তরাধিকার আপনাকে একটি নতুন ক্লাস (সাবক্লাস) তৈরি করতে দেয় একটি বিদ্যমান ক্লাস (বেস ক্লাস) থেকে বৈশিষ্ট্য এবং পদ্ধতিগুলি উত্তরাধিকারসূত্রে পাওয়া যায়, এবং তাদের প্রসারিত বা ওভাররাইড করতে পারে।

মৌলিক সিনট্যাক্স

Python
class Animale:
    def __init__(self, nome):
        self.nome = nome

    def saluta(self):
        return f"{self.nome} fa un verso"

class Cane(Animale):       # Cane EREDITA da Animale
    def saluta(self):       # OVERRIDE del metodo
        return f"{self.nome} dice WOOF!"

a = Animale("X")
c = Cane("Fido")
a.saluta()      # 'X fa un verso'
c.saluta()      # 'Fido dice WOOF!'

Cane উত্তরাধিকার সূত্রে __init__ থেকে Animale এটিকে পুনঃলিখন ছাড়াই।

super(): বেস পদ্ধতিতে কল করা

আপনি যখন একটি বেস পদ্ধতি প্রসারিত করতে চান (পুরোপুরি প্রতিস্থাপন করবেন না), ব্যবহার করুন super():

Python
class Animale:
    def __init__(self, nome):
        self.nome = nome

class Cane(Animale):
    def __init__(self, nome, razza):
        super().__init__(nome)    # delega alla base
        self.razza = razza

c = Cane("Fido", "Labrador")
c.nome        # 'Fido'
c.razza       # 'Labrador'

isinstance: টাইপ চেক

Python
isinstance(c, Cane)        # True
isinstance(c, Animale)     # True (anche la base)
isinstance(c, str)         # False

isinstance(x, BaseClass) এছাড়াও সমস্ত সাবক্লাসকে চিনতে পারে: এটিই পলিমরফিজম এর জন্য উত্তরাধিকার উপযোগী করে তোলে।

Python
animali = [Cane("Fido", "X"), Animale("Pippo")]
for a in animali:
    print(a.saluta())        # ogni oggetto risponde a suo modo

MRO (পদ্ধতি রেজোলিউশন অর্ডার) — ওভারভিউ

যখন আপনার একাধিক উত্তরাধিকার থাকে, তখন পাইথন সিদ্ধান্ত নেয় কোন ক্রমে দেখতে হবে C3 অ্যালগরিদম দিয়ে গণনা করা MRO অনুসরণ করে একটি পদ্ধতির জন্য। জন্য 95% ক্ষেত্রে এটি জানা যথেষ্ট:

  1. এটি উদাহরণে প্রথম দেখায়,
  2. তারপর তার ক্লাসে,
  3. তারপর বেস ক্লাসে ঘোষণা ক্রমে।
Python
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)

object পাইথন 3-এর প্রতিটি ক্লাসের মূল।

তোমার পালা

ব্যায়াম#python.m7.l2.e1
প্রচেষ্টা: 0লোড হচ্ছে...

প্রদত্ত `শ্রেণির যানবাহন: def __init__(self, brand): self.brand = brand`, __init__(self, brand, model) দিয়ে `Car(Vehicle)' সংজ্ঞায়িত করুন যা super().__init__ বলে এবং self.model স্টোর করে। `a = Car('Fiat', '500')` তৈরি করুন এবং `(a.brand, a.model)` মূল্যায়ন করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

super().__init__(ব্র্যান্ড) তারপর self.model = মডেল।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম পর্যালোচনা করুন

ব্যায়াম#python.m7.l2.e2
প্রচেষ্টা: 0লোড হচ্ছে...

__init__(self, side) এবং area() এর সাথে রিটার্ন 0` এবং `class Square(Shape)` রিটার্ন করুন যেটি সাইড * সাইড দেয়। `q = স্কোয়ার(5)` তৈরি করুন এবং টিপল মূল্যায়ন করুন `(q.area(), isinstance(q, Shape))`।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

self.side * self.side.

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

অতিরিক্ত চ্যালেঞ্জ

ব্যায়াম#python.m7.l2.e3
প্রচেষ্টা: 0লোড হচ্ছে...

Create a class `Square` that inherits from the `Rectangle` class (defined below). The constructor of `Square` must take a single parameter `side` and pass it to `super().__init__(side, side)`. Instantiate a square with side `6` in `sq` and evaluate `sq.area()`.

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

Declare class Square(Rectangle): and call super().__init__(side, side) in the constructor.

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ