שיעורי מודול (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 (צו פתרון שיטה) - סקירה כללית
כאשר יש לך ירושה מרובה, Python מחליט באיזה סדר לחפש עבור שיטה על ידי ביצוע ה-MRO, המחושב באמצעות אלגוריתם C3. עבור 95% מהמקרים זה מספיק כדי לדעת:
- זה נראה תחילה במקרה,
- אז בכיתה שלו,
- לאחר מכן במחלקות הבסיס לפי סדר הכרזה.
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)object הוא השורש של כל מחלקה ב- Python 3.
התור שלך
בהינתן `מחלקה רכב: def __init__(עצמי, מותג): self.brand = מותג`, הגדר `מכונית(רכב)` עם __init__(עצמי, מותג, דגם) שקורא לסופר().__init__ ומאחסן self.model. צור `a = Car('Fiat', '500')` והעריך את `(a.brand, a.model)`.
הצג רמז
super().__init__(brand) ואז self.model = model.
הפתרון זמין לאחר 3 ניסיונות
סקירת התרגיל
הגדר `class Shape: def area(self): return 0` ו`class Square(Shape)` עם __init__(עצמי, צד) ו-area() שמחזיר צד * צד. צור `q = Square(5)` והעריך את ה-tuple `(q.area(), isinstance(q, Shape))`.
הצג רמז
עצמי.צד * עצמי.צד.
הפתרון זמין לאחר 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 ניסיונות