Наследование в Python: концепции, синтаксис и практические примеры
Наследование в Python
Наследование позволяет создавать новый класс, наследующий всю функциональность родительского класса, с добавлением или расширением возможностей. Это руководство объясняет, как использовать наследование в Python, с понятными примерами и рекомендациями.
Видео: Наследование в Python
Наследование в Python
Наследование — ключевой принцип объектно-ориентированного программирования, способствующий переиспользованию кода и логической иерархии. Новый класс (производный или дочерний) определяется с минимальными или нулевыми изменениями существующего класса (базового или родительского). Дочерний класс автоматически получает атрибуты и методы родителя, которые затем могут быть переопределены или расширены по необходимости.
Синтаксис наследования в Python
class BaseClass:
# тело базового класса
class DerivedClass(BaseClass):
# тело производного класса
В приведённом фрагменте DerivedClass наследует все публичные члены BaseClass. Добавлением новых методов или переопределением существующих производный класс может настраивать поведение, переиспользуя базовую реализацию.
Пример наследования в Python
Продемонстрируем наследование на практике. Допустим, у нас есть общий класс Polygon, хранящий число сторон и их длины:
class Polygon:
def __init__(self, no_of_sides):
self.n = no_of_sides
self.sides = [0 for _ in range(no_of_sides)]
def input_sides(self):
self.sides = [float(input(f"Enter side {i+1} : ")) for i in range(self.n)]
def display_sides(self):
for i, side in enumerate(self.sides, 1):
print(f"Side {i} is {side}")
Класс Polygon инкапсулирует общие атрибуты и методы для любого многоугольника. Triangle — конкретный многоугольник ровно с тремя сторонами, поэтому он может наследовать от Polygon без переопределения общей логики:
class Triangle(Polygon):
def __init__(self):
super().__init__(3) # инициализировать базовый с 3 сторонами
def find_area(self):
a, b, c = self.sides
s = (a + b + c) / 2
area = (s * (s - a) * (s - b) * (s - c)) ** 0.5
print(f"The area of the triangle is {area:.2f}")
Запуск следующего кода демонстрирует наследование в действии:
>>> t = Triangle()
>>> t.input_sides()
Enter side 1 : 3
Enter side 2 : 5
Enter side 3 : 4
>>> t.display_sides()
Side 1 is 3.0
Side 2 is 5.0
Side 3 is 4.0
>>> t.find_area()
The area of the triangle is 6.00
Обратите внимание, что Triangle может вызывать input_sides() и display_sides(), хотя никогда их не определяет — наследование делает эти методы доступными автоматически.
Если атрибут или метод не найден в дочернем классе, Python ищет в родительском, и этот поиск продолжается вверх по цепочке наследования при необходимости.
Переопределение методов в Python
И Polygon, и Triangle определяют метод __init__. Реализация дочернего переопределяет родительскую, но может (и должна) расширять базовую логику, вызывая её явно. Использование super() — современный, предпочтительный подход:
class Triangle(Polygon):
def __init__(self):
super().__init__(3) # вызывает Polygon.__init__
При переопределении дочерний метод может добавлять новое поведение или модифицировать базовое, сохраняя оригинальную функциональность.
Python предоставляет isinstance() и issubclass() для интроспекции отношений наследования:
t = Triangle()
print(isinstance(t, Triangle)) # True
print(isinstance(t, Polygon)) # True
print(isinstance(t, int)) # False
print(isinstance(t, object)) # True
print(issubclass(Polygon, Triangle)) # False
print(issubclass(Triangle, Polygon)) # True
print(issubclass(bool, int)) # True
Эти утилиты необходимы для проверки типов и обеспечения соответствия объектов ожидаемым интерфейсам.
Подробнее о super() см. в документации Python super() function.
Python
- Освоение типов данных в Python: практическое руководство
- Мастерство операторов Python: Полное руководство
- Оператор pass в Python: практическое руководство
- Словари в Python: создание, манипуляции и продвинутые техники
- Пользовательские исключения в Python: практическое руководство
- Объектно-ориентированное программирование в Python: классы, наследование, инкапсуляция и полиморфизм
- Перегрузка операторов в Python: практическое руководство
- Декоратор @property в Python: чистые, обратно совместимые геттеры и сеттеры
- Понимание type() и isinstance() в Python: практические примеры
- Наследование в C#: базовые и производные классы, интерфейсы