English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной курс Python

Управление потоком Python

Функции в Python

Типы данных в Python

Файловые операции Python

Объекты и классы Python

Python дата и время

Продвинутые знания Python

Руководство по Python

Ингеритация в Python

Наследование позволяет нам определить класс, который наследует все функции родительского класса и позволяет добавлять дополнительные функции. В этой статье вы узнаете, как использовать наследование в Python.

Что такое наследование?

Наследование — это мощная функция面向 объектного программирования.

Это означает определение новогокласс, при этом изменения в существующий класс минимальны или отсутствуют. Новый класс называетсядеривированным (или дочерним) классом, а новый класс, наследующий от него, называетсяБазовый (или родительский) класс.

Синтаксис наследования в Python

class BaseClass:
  # Основной код базового класса
class DerivedClass(BaseClass):
  # Основной код производного класса

Деривированные классы наследуют элементы от базового класса и добавляют новые элементы. Это可以提高 повторное использование кода.

Пример наследования в Python

Чтобы продемонстрировать использование наследования, давайте рассмотрим пример.

Многоугольник — это замкнутая фигура с тремя или более сторонами. Например, у нас есть класс под названием Polygon, который определен следующим образом.

class Polygon:
    def __init__(self, no_of_sides):
        self.n = no_of_sides
        self.sides = [0 for i in range(no_of_sides)]
    def inputSides(self):
        self.sides = [float(input("Ввести размер сторон "+str(i+1)+" : ")) for i in range(self.n)]
    def dispSides(self):
        for i in range(self.n):
            print("Размер сторон", i+1, "является", self.sides[i])

Этот класс имеет данные атрибуты, используемые для хранения количества сторон, сторонЧислои размер каждой стороны в виде списка, то естьКоличество сторон.

Метод inputSides() принимает размер каждой стороны, подобно тому, как dispSides() правильно показывает их.

Треугольник является многоугольником с тремя сторонами. Таким образом, мы можем создать класс, называемый Triangle, который наследуется от Polygon. Это позволяет легко использовать все доступные свойства в Polygon через Triangle. Мы не нуждаемся в повторном определении их (повторное использование кода). Класс Triangle определен следующим образом.

class Triangle(Polygon):
    def __init__(self):
        Polygon.__init__(self, 3)
    def findArea(self):
        a, b, c = self.sides
        # Вычислить полуокружность
        s = (a + b + c) / 2
        area = (s*(s-a)*(s-b)*(s-c)) ** 0.5
        print('Площадь треугольника составляет %0.2f' %area)

Однако, класс Triangle имеет новый метод findArea(), который находит и выводит площадь треугольника. Это пример выполнения.

>>> t = Triangle()
>>> t.inputSides()
Ввести размер сторон 1: 3
Ввести размер сторон 2: 5
Ввести размер сторон 3: 4
>>> t.dispSides()
Сторонний размер 1 равен 3.0
Сторонний размер 2 равен 5.0
Сторонний размер 3 равен 4.0
>>> t.findArea()
Площадь треугольника составляет 6.00

Мы можем видеть, что,尽管我们没有为类Triangle定义inputSides()或sides()之类的函数,但我们仍然可以使用它们。

Если атрибут не найден в классе, поиск продолжается до базового класса. Если базовый класс himself является производным от другого класса, то операция повторяется рекурсивно.

Переписывание методов в Python

В примере, приведенном выше, обратите внимание, что в классах Triangle и Polygon определены методы __init__(). В таких случаях метод производного класса будет перекрывать метод базового класса. То есть, __init__() в Triangle имеет приоритет перед __init__() в Polygon.

Обычно, когда мы расширяем базовые методы, мы предпочитаем расширять их определение, а не просто заменять. Это достигается вызовом методов базового класса из производного класса (вызов Polygon.__init__() из __init__() в Triangle).

Лучшим выбором является использование встроенной функции super(). Таким образом, super().__init__(3) эквивалентно Polygon.__init__(self, 3) и является предпочтительным. Вы можете узнать больше оВ PythonФункция super()Более подробная информация.

Два встроенных функции isinstance() и issubclass() используются для проверки наследования. Если объект является примером класса или другого класса, происходящего от него, функция isinstance() возвращает True. Каждый класс в Python наследуется от базового класса object.

>>> isinstance(t, Triangle)
True
>>> isinstance(t, Polygon)
True
>>> isinstance(t, int)
False
>>> isinstance(t, object)
True

Таким образом, issubclass() используется для проверки наследования классов.

>>> issubclass(Polygon, Triangle)
False
>>> issubclass(Triangle, Polygon)
True
>>> issubclass(bool, int)
True