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