Menu
Coddy logo textTech

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

Часть раздела Object Oriented Programming путешествия по Python на Coddy. Урок 19 из 64.

Переопределение методов позволяет дочернему классу предоставить свою собственную реализацию метода, который уже существует в родительском классе.

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

class Animal:
    def __init__(self, name):
        self.name = name
    
    def make_sound(self):
        print("Some generic animal sound")
    
    def info(self):
        print(f"I am {self.name}")

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

class Dog(Animal):
    def make_sound(self):
        print("Woof! Woof!")  # Переопределение родительского метода

Метод make_sound в Dog заменяет метод из Animal, но info по-прежнему наследуется без изменений.

Создайте экземпляры и протестируйте методы:

animal = Animal("Generic Animal")
dog = Dog("Buddy")

Вызовите переопределенный метод:

animal.make_sound()
dog.make_sound()

Вызовите непереопределенный метод:

animal.info()
dog.info()

Вывод:

Some generic animal sound
Woof! Woof!
I am Generic Animal
I am Buddy

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

class Cat(Animal):
    def make_sound(self):
        print("Meow!")
    
    def info(self):
        print(f"I am {self.name}, a sneaky cat")

cat = Cat("Whiskers")
cat.make_sound()
cat.info()

Вывод:

Meow!
I am Whiskers, a sneaky cat

Ключевой момент: Переопределение методов позволяет дочерним классам настраивать унаследованное поведение. Просто определите метод с тем же именем в дочернем классе. Версия дочернего класса будет использоваться вместо версии родительского класса.

challenge icon

Задание

Средне

В этом испытании вы реализуете иерархию фигур.

  • shape.py — содержит родительский класс Shape с атрибутом color и методами
  • circle.py — содержит класс Circle, который наследуется от Shape
  • square.py — содержит класс Square, который наследуется от Shape

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

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

from shape import Shape
from circle import Circle
from square import Square

# Обработчик тестовых случаев
test_case = input()

if test_case == "base_shape":
    # Тестирование базового класса Shape
    shape = Shape("green")
    print(f"Color: {shape.color}")
    print(f"Area: {shape.area()}")
    print("Describe output:")
    shape.describe()

elif test_case == "circle_basics":
    # Тестирование создания Circle и базовых методов
    circle = Circle("red", 5)
    print(f"Color: {circle.color}")
    print(f"Radius: {circle.radius}")
    print(f"Area (rounded): {round(circle.area(), 2)}")
    print("Describe output:")
    circle.describe()

elif test_case == "square_basics":
    # Тестирование создания Square и базовых методов
    square = Square("blue", 4)
    print(f"Color: {square.color}")
    print(f"Side length: {square.side_length}")
    print(f"Area: {square.area()}")
    print("Describe output:")
    square.describe()

elif test_case == "various_sizes":
    # Тестирование нескольких экземпляров с разными размерами
    shapes = [
        Circle("yellow", 2),
        Circle("orange", 7.5),
        Square("purple", 3),
        Square("black", 10)
    ]
    
    for i, shape in enumerate(shapes, 1):
        print(f"Shape {i}:")
        shape.describe()
        print(f"Area: {round(shape.area(), 2)}")
        print()  # Пустая строка для читаемости

elif test_case == "shape_polymorphism":
    # Тестирование полиморфного поведения со списком фигур
    shapes = [
        Shape("white"),
        Circle("red", 3),
        Square("blue", 4)
    ]
    
    print("Polymorphic behavior demonstration:")
    for shape in shapes:
        shape.describe()
        print(f"Area: {round(shape.area(shape_polymorphism), 2)}")
        print()  # Пустая строка для читаемости

elif test_case == "original_test_case":
    # Запуск оригинального тестового кода из задания
    circle = Circle("red", 5)
    square = Square("blue", 4)

    # Тестирование метода describe
    circle.describe()
    square.describe()

    # Тестирование метода area
    print(f"Circle area: {circle.area()}")
    print(f"Square area: {square.area()}")
quiz iconПроверьте себя

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

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

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