דילוג לתוכן המרכזי
מודול 7 · שיעור 2 מתוך 426/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 (צו פתרון שיטה) - סקירה כללית

כאשר יש לך ירושה מרובה, Python מחליט באיזה סדר לחפש עבור שיטה על ידי ביצוע ה-MRO, המחושב באמצעות אלגוריתם C3. עבור 95% מהמקרים זה מספיק כדי לדעת:

  1. זה נראה תחילה במקרה,
  2. אז בכיתה שלו,
  3. לאחר מכן במחלקות הבסיס לפי סדר הכרזה.
Python
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)

object הוא השורש של כל מחלקה ב- Python 3.

התור שלך

פעילות גופנית#python.m7.l2.e1
ניסיונות: 0טוען...

בהינתן `מחלקה רכב: def __init__(עצמי, מותג): self.brand = מותג`, הגדר `מכונית(רכב)` עם __init__(עצמי, מותג, דגם) שקורא לסופר().__init__ ומאחסן self.model. צור `a = Car('Fiat', '500')` והעריך את `(a.brand, a.model)`.

טוען עורך...
הצג רמז

super().__init__(brand) ואז self.model = model.

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#python.m7.l2.e2
ניסיונות: 0טוען...

הגדר `class Shape: def area(self): return 0` ו`class Square(Shape)` עם __init__(עצמי, צד) ו-area() שמחזיר צד * צד. צור `q = Square(5)` והעריך את ה-tuple `(q.area(), isinstance(q, Shape))`.

טוען עורך...
הצג רמז

עצמי.צד * עצמי.צד.

הפתרון זמין לאחר 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 ניסיונות