মডিউল পাঠ (2/4)
উত্তরাধিকার
উত্তরাধিকার আপনাকে একটি নতুন ক্লাস (সাবক্লাস) তৈরি করতে দেয় একটি বিদ্যমান ক্লাস (বেস ক্লাস) থেকে বৈশিষ্ট্য এবং পদ্ধতিগুলি উত্তরাধিকারসূত্রে পাওয়া যায়, এবং তাদের প্রসারিত বা ওভাররাইড করতে পারে।
মৌলিক সিনট্যাক্স
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():
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: টাইপ চেক
isinstance(c, Cane) # True
isinstance(c, Animale) # True (anche la base)
isinstance(c, str) # Falseisinstance(x, BaseClass) এছাড়াও সমস্ত সাবক্লাসকে চিনতে পারে: এটিই
পলিমরফিজম এর জন্য উত্তরাধিকার উপযোগী করে তোলে।
animali = [Cane("Fido", "X"), Animale("Pippo")]
for a in animali:
print(a.saluta()) # ogni oggetto risponde a suo modoMRO (পদ্ধতি রেজোলিউশন অর্ডার) — ওভারভিউ
যখন আপনার একাধিক উত্তরাধিকার থাকে, তখন পাইথন সিদ্ধান্ত নেয় কোন ক্রমে দেখতে হবে C3 অ্যালগরিদম দিয়ে গণনা করা MRO অনুসরণ করে একটি পদ্ধতির জন্য। জন্য 95% ক্ষেত্রে এটি জানা যথেষ্ট:
- এটি উদাহরণে প্রথম দেখায়,
- তারপর তার ক্লাসে,
- তারপর বেস ক্লাসে ঘোষণা ক্রমে।
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)object পাইথন 3-এর প্রতিটি ক্লাসের মূল।
তোমার পালা
প্রদত্ত `শ্রেণির যানবাহন: 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 প্রচেষ্টার পরে উপলব্ধ
ব্যায়াম পর্যালোচনা করুন
__init__(self, side) এবং area() এর সাথে রিটার্ন 0` এবং `class Square(Shape)` রিটার্ন করুন যেটি সাইড * সাইড দেয়। `q = স্কোয়ার(5)` তৈরি করুন এবং টিপল মূল্যায়ন করুন `(q.area(), isinstance(q, Shape))`।
ইঙ্গিত দেখান
self.side * self.side.
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
অতিরিক্ত চ্যালেঞ্জ
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 প্রচেষ্টার পরে উপলব্ধ