Переопределение методов
Часть раздела Объектно-ориентированное программирование путешествия по 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Ключевой момент: переопределение метода позволяет дочерним классам настраивать унаследованное поведение. Просто определите метод с тем же именем в дочернем классе. Будет использоваться версия дочернего класса, а не версия родительского класса.
Задание
СреднеВ этом задании ты реализуешь иерархию фигур.
shape.py— содержит родительский классShapeс атрибутомcolorи методамиcircle.py— содержит классCircle, который наследуется отShapesquare.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()}")В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Введение в ООПВнешние файлыКлассы и объектыПараметр selfМетодыАтрибутыМетод-конструктор (__init__)Повторение — простой калькулятор4Наследование
Основы наследованияФункция super()Переопределение методовМножественное наследованиеПорядок разрешения методовПовторение: иерархия сотрудников7Специальные методы
Введение в магические методыПерегрузка операторовМагические методы контейнеровПовторение — пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»2Декораторы
Введение в декораторыДекоратор свойстваДекоратор статического методаДекоратор метода класса5Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур8Продвинутые концепции ООП
Композиция и наследованиеМиксиныСтатические методы и методы классаДекораторы классовМенеджеры контекста11Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»3Свойства классов
Переменные экземпляра и классаДекораторы свойствПриватные атрибутыПовторение — менеджер банковского счёта6Инкапсуляция
Публичные, защищённые и приватные членыМодификаторы доступаСокрытие информацииПродвинутые декораторы свойствПовторение — система учёта студентов12Проект: Система управления библиотекой
Обзор проектаКлассы книг и пользователейСистема выдачи книгФункция поискаИнтерфейс администратораТестирование и интеграцияПотренируйтесь самостоятельно: Онлайн-компилятор Python