Перейти к основному содержимому
Модуль 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Загрузка…

Учитывая `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 = model.

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#python.m7.l2.e2
Попыток: 0Загрузка…

Определите класс Shape: def area(self): return 0 и class Square(Shape) с помощью __init__(self,side) и area(), который возвращает сторону * сторону. Создайте `q = Square(5)` и оцените кортеж `(q.area(), isinstance(q, Shape))`.

Загрузка редактора…
Показать подсказку

self.side * self.side.

Решение доступно после 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 попыток