Наследование и полиморфизм — это фундаментальные концепции объектно-ориентированного программирования (ООП), которые позволяют создавать гибкие и повторно используемые программы. Давайте подробнее рассмотрим эти концепции и приведем дополнительные примеры для лучшего понимания.
Наследование
Наследование позволяет одному классу (подклассу) наследовать атрибуты и методы другого класса (суперкласса). Это помогает повторно использовать код и создавать иерархии классов.
Объявление наследования
class BaseClass:
def __init__(self, base_attr):
self.base_attr = base_attr
def base_method(self):
print("Method from BaseClass")
class DerivedClass(BaseClass):
def __init__(self, base_attr, derived_attr):
super().__init__(base_attr)
self.derived_attr = derived_attr
def derived_method(self):
print("Method from DerivedClass")
# Создание объекта DerivedClass
derived = DerivedClass("Base Attribute", "Derived Attribute")
# Вызов метода базового класса
derived.base_method() # Вывод: Method from BaseClass
# Вызов метода производного класса
derived.derived_method() # Вывод: Method from DerivedClass
Полиморфизм
Полиморфизм позволяет объектам разных классов предоставлять разные реализации одного и того же метода. Это делает код более гибким и расширяемым.
Пример полиморфизма
class Animal:
def make_sound(self):
pass
class Dog(Animal):
def make_sound(self):
print("Woof!")
class Cat(Animal):
def make_sound(self):
print("Meow!")
# Создание объектов и вызов метода make_sound()
dog = Dog()
cat = Cat()
dog.make_sound() # Вывод: Woof!
cat.make_sound() # Вывод: Meow!
Полиморфизм через общий интерфейс
Благодаря полиморфизму можно использовать объекты разных классов через их общий интерфейс, что упрощает работу с различными типами объектов.
animals = [Dog(), Cat()]
for animal in animals:
animal.make_sound()
# Вывод:
# Woof!
# Meow!
Преимущества наследования и полиморфизма
- Повторное использование кода: можно использовать функциональность базового класса в производных классах.
- Упрощение кода: можно создавать иерархии классов, делая код более организованным и понятным.
- Расширяемость: можно легко добавлять новую функциональность в производные классы, не затрагивая базовый код.
Дополнительные примеры
Пример с геометрическими фигурами
Рассмотрим пример, где у нас есть базовый класс
Shape
и производные классы Circle
и Rectangle
, которые переопределяют метод area()
.import math
class Shape:
def area(self):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return math.pi * self.radius ** 2
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
# Создание объектов и вызов метода area()
circle = Circle(5)
rectangle = Rectangle(4, 6)
print(circle.area()) # Вывод: 78.53981633974483
print(rectangle.area()) # Вывод: 24
Пример с транспортными средствами
Рассмотрим пример, где у нас есть базовый класс
Vehicle
и производные классы Car
и Bike
, которые переопределяют метод move()
.class Vehicle:
def move(self):
pass
class Car(Vehicle):
def move(self):
print("Car is moving")
class Bike(Vehicle):
def move(self):
print("Bike is moving")
# Создание объектов и вызов метода move()
car = Car()
bike = Bike()
car.move() # Вывод: Car is moving
bike.move() # Вывод: Bike is moving
# Использование полиморфизма через общий интерфейс
vehicles = [Car(), Bike()]
for vehicle in vehicles:
vehicle.move()
# Вывод:
# Car is moving
# Bike is moving