Модульні уроки (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 (Method Resolution Order) — огляд
Якщо у вас множинне успадкування, Python вирішує, у якому порядку шукати для методу, дотримуючись MRO, обчисленого за допомогою алгоритму C3. для У 95% випадків достатньо знати:
- він виглядає першим у екземплярі,
- потім у своєму класі,
- потім у базових класах у порядку оголошення.
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)object є коренем кожного класу в Python 3.
Ваша черга
Враховуючи `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 спроб
Повторна вправа
Визначте `клас Shape: def area(self): return 0` і `class Square(Shape)` з __init__(self, side) і area(), який повертає side * side. Створіть `q = Square(5)` та обчисліть кортеж `(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 спроб