Salt la conținutul principal
Modulul 7 · Lecția 2 din 426/36 în curs~12 min
Lecții din modul (2/4)

Moștenirea

Moștenirea vă permite să creați o nouă clasă (subclasa) care moștenește atribute și metode dintr-o clasă existentă (clasa de bază), și le poate extinde sau anula.

Sintaxa de bază

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 moștenește __init__ de la Animale fără a-l rescrie.

super(): apelarea metodei de bază

Când doriți să extindeți o metodă de bază (nu să o înlocuiți complet), utilizați 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: verificare tip

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

isinstance(x, BaseClass) recunoaște și toate subclasele: asta este face moștenirea utilă pentru polimorfism.

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

MRO (Method Resolution Order) — prezentare generală

Când aveți moștenire multiplă, Python decide în ce ordine să caute pentru o metodă urmând MRO, calculată cu algoritmul C3. Pentru 95% din cazuri este suficient să știți:

  1. arată primul în instanță,
  2. apoi în clasa sa,
  3. apoi în clasele de bază în ordinea declaraţiei.
Python
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)

object este rădăcina fiecărei clase din Python 3.

Rândul tău

Exercițiu#python.m7.l2.e1
Încercări: 0Se încarcă…

Dată `clasa Vehicul: def __init__(self, brand): self.brand = brand`, definiți `Car(Vehicle)` cu __init__(self, brand, model) care numește super().__init__ și stochează self.model. Creați `a = Car('Fiat', '500')` și evaluați `(a.brand, a.model)`.

Se încarcă editorul...
Afișează indiciu

super().__init__(brand) apoi self.model = model.

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#python.m7.l2.e2
Încercări: 0Se încarcă…

Definiți `class Shape: def area(self): return 0` și `class Square(Shape)` cu __init__(self, side) și area() care returnează side * side. Creați `q = Square(5)` și evaluați tuplul `(q.area(), isinstance(q, Shape))`.

Se încarcă editorul...
Afișează indiciu

partea de sine * partea de sine.

Soluție disponibilă după 3 încercări

Provocare suplimentară

Exercițiu#python.m7.l2.e3
Încercări: 0Se încarcă…

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()`.

Se încarcă editorul...
Afișează indiciu

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

Soluție disponibilă după 3 încercări