Menu
Coddy logo textTech

Снова о переопределении методов

Часть раздела Object Oriented Programming путешествия по 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 с атрибутами make/model и методами
  • car.py: Создайте класс Car, который наследуется от Vehicle
  • motorcycle.py: Создайте класс Motorcycle, который наследуется от Vehicle
  • truck.py: Создайте класс Truck, который наследуется от Vehicle

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

Шпаргалка

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

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

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!"

Вызовите один и тот же метод для разных объектов:

animals = [Dog(), Cat(), Animal()]
for animal in animals:
    print(animal.speak())  # Каждый выводит разный результат

Используйте полиморфизм с функциями:

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

make_animal_speak(Dog())  # Woof!
make_animal_speak(Cat())  # Meow!

Полиморфизм позволяет вам одинаково обращаться с разными объектами через общий интерфейс, что делает код более гибким и простым в расширении.

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

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Проверьте себя

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

Все уроки раздела Object Oriented Programming