Наследование и полиморфизм являются двумя из четырех основных принципов объектно-ориентированного программирования. Они позволяют программистам создавать гибкие и масштабируемые структуры кода, повышая эффективность разработки и поддержки программного обеспечения.
Теоретическая часть
Наследование
Наследование позволяет одному классу (дочернему классу) наследовать атрибуты и методы другого класса (родительского). Это обеспечивает иерархию классов и способствует повторному использованию кода.
Полиморфизм
Полиморфизм дает возможность одному интерфейсу принимать множество форм. В контексте ООП это означает, что методы могут вести себя по-разному в зависимости от объекта (или класса), к которому они принадлежат.
Примеры кода
# Пример наследования
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
pass
class Dog(Animal):
def speak(self):
return f"{self.name} says Woof!"
class Cat(Animal):
def speak(self):
return f"{self.name} says Meow!"
# Пример полиморфизма
def animal_sound(animal):
print(animal.speak())
dog = Dog("Buddy")
cat = Cat("Whiskers")
animal_sound(d
animal_sound(dog) # Выведет "Buddy says Woof!"
animal_sound(cat) # Выведет "Whiskers says Meow!"
Практические задания
1. Создайте класс Shape с методом area(), который возвращает 0. Затем создайте производные классы Rectangle и Circle, переопределяющие метод area() для вычисления площади фигуры.
2. Разработайте функцию print_area(), которая принимает объект формы и выводит его площадь. Используйте эту функцию для демонстрации полиморфизма.
Решение задания
# Классы Shape, Rectangle и Circle
class Shape:
def area(self):
return 0
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius * self.radius
# Функция print_area
def print_area(shape):
print(f"The area is {shape.area()}")
rect = Rectangle(10, 5)
circle = Circle(7)
print_area(rect)
print_area(circle)