ماڈیول اسباق (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 (میتھڈ ریزولوشن آرڈر) - جائزہ
جب آپ کے پاس ایک سے زیادہ وراثت ہوتی ہے، تو ازگر فیصلہ کرتا ہے کہ کس ترتیب میں دیکھنا ہے۔ ایک طریقہ کے لیے MRO کی پیروی کرتے ہوئے، C3 الگورتھم کے ساتھ حساب کیا گیا۔ کے لیے 95% معاملات میں یہ جاننا کافی ہے:
- یہ مثال میں پہلے نظر آتا ہے،
- پھر اس کی کلاس میں،
- پھر ڈیکلریشن آرڈر میں بیس کلاسز میں۔
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)object Python 3 میں ہر کلاس کی جڑ ہے۔
آپ کی باری
دی گئی `کلاس وہیکل: def __init__(self, brand): self.brand = brand`، __init__(self, brand, model) کے ساتھ `Car(وہیکل) کی وضاحت کریں جو super().__init__ کہتی ہے اور self.model کو اسٹور کرتی ہے۔ `a = کار('Fiat', '500')` بنائیں اور `(a.brand, a.model)` کا اندازہ کریں۔
اشارہ دکھائیں۔
super().__init__(برانڈ) پھر self.model = ماڈل۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
`کلاس شیپ: ڈیف ایریا (سیلف): واپسی 0` اور `کلاس اسکوائر (شکل)` کی وضاحت کریں __init__(self, side) اور area() جو سائیڈ * سائیڈ کو لوٹاتا ہے۔ `q = مربع(5)` بنائیں اور tuple `(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 کوششوں کے بعد حل دستیاب ہے۔