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, которые будут шаг за шагом направлять вас в процессе реализации.

Шпаргалка

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

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

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 по-прежнему наследуется без изменений.

Вы можете переопределить несколько методов:

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

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

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

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