Перейти до основного вмісту
Модуль 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 (Method Resolution Order) — огляд

Якщо у вас множинне успадкування, Python вирішує, у якому порядку шукати для методу, дотримуючись MRO, обчисленого за допомогою алгоритму C3. для У 95% випадків достатньо знати:

  1. він виглядає першим у екземплярі,
  2. потім у своєму класі,
  3. потім у базових класах у порядку оголошення.
Python
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)

object є коренем кожного класу в Python 3.

Ваша черга

вправи#python.m7.l2.e1
Спроби: 0Завантаження…

Враховуючи `class Vehicle: def __init__(self, brand): self.brand = brand`, визначте `Car(Vehicle)` за допомогою __init__(self, brand, model), який викликає super().__init__ і зберігає self.model. Створіть `a = Car('Fiat', '500')` і обчисліть `(a.brand, a.model)`.

Завантаження редактора…
Показати підказку

super().__init__(бренд), потім self.model = модель.

Рішення доступне після 3 спроб

Повторна вправа

вправи#python.m7.l2.e2
Спроби: 0Завантаження…

Визначте `клас Shape: def area(self): return 0` і `class Square(Shape)` з __init__(self, side) і area(), який повертає side * side. Створіть `q = Square(5)` та обчисліть кортеж `(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 спроб