Menu
CoddyTech

Переопределение методов: повторение

Часть раздела Объектно-ориентированное программирование путешествия по Python на Coddy. Урок 23 из 64.

Полиморфизм означает «много форм» и позволяет объектам разных классов по-разному реагировать на один и тот же вызов метода. Это становится возможным благодаря переопределению методов.

Вот родительский класс с методом:

class Animal:
    def speak(self):
        return "Animal makes a sound"

Создайте дочерние классы, которые переопределяют один и тот же метод:

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

class Cow(Animal):
    def speak(self):
        return "Moo!"

Каждый дочерний класс предоставляет собственную реализацию speak().

Создай список разных животных:

animals = [Dog(), Cat(), Cow(), Animal()]

Вызови один и тот же метод у всех объектов:

for animal in animals:
    print(animal.speak())

Вывод:

Woof!
Meow!
Moo!
Animal makes a sound

Это полиморфизм в действии: один и тот же вызов метода ведёт себя по-разному в зависимости от фактического типа объекта.

Вы также можете использовать полиморфизм с функциями:

def make_animal_speak(animal):
    print(animal.speak())

dog = Dog()
cat = Cat()

make_animal_speak(dog)  # Гав!
make_animal_speak(cat)  # Мяу!

Функции не нужно знать, животное какого типа она получает: она просто вызывает speak() и получает нужное поведение.

Ключевой момент: полиморфизм позволяет обращаться с разными объектами одинаково через общий интерфейс. Переопределение методов обеспечивает разные реализации, а полиморфизм позволяет вызывать их единообразно. Благодаря этому код становится более гибким и его проще расширять.

challenge icon

Задание

Средне

В этом задании вы реализуете систему наследования для транспортных средств.

Вам нужно отредактировать следующие файлы:

  • vehicle.py: реализуйте базовый класс Vehicle с атрибутами марки и модели и методами
  • car.py: создайте класс Car, наследующий от Vehicle
  • motorcycle.py: создайте класс Motorcycle, наследующий от Vehicle
  • truck.py: создайте класс Truck, наследующий от Vehicle

В каждом файле есть подробные комментарии TODO, которые шаг за шагом помогут вам реализовать решение. Обратите внимание на инструкции импорта, необходимые для взаимодействия файлов, и соблюдайте связи наследования. Файл driver.py содержит тесты, которые проверят, правильно ли ваша реализация работает со всеми типами транспортных средств.

Попробуйте сами

from vehicle import Vehicle
from car import Car
from motorcycle import Motorcycle
from truck import Truck

def vehicle_info(vehicle):
    return f"{vehicle.make} {vehicle.model}: {vehicle.start()}, Efficiency: {vehicle.fuel_efficiency()} mpg"


# Проверьте на разных транспортных средствах — НЕ ИЗМЕНЯЙТЕ ЭТОТ ТЕСТОВЫЙ КОД
vehicles = [
    Car("Toyota", "Camry"),
    Motorcycle("Harley", "Davidson"),
    Truck("Ford", "F-150"),
    Vehicle("Generic", "Vehicle")
]

for v in vehicles:
    print(vehicle_info(v))
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Python