Наследование Python (с примерами)

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

Видео: наследование Python

Наследование в Python

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

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

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

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

Производный класс наследует функции от базового класса, и к нему могут быть добавлены новые функции. Это приводит к повторному использованию кода.

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

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

Многоугольник - это замкнутая фигура с 3 или более сторонами. Скажем, у нас есть класс, который 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("Enter side "+str(i+1)+" : ")) for i in range(self.n)) def dispSides(self): for i in range(self.n): print("Side",i+1,"is",self.sides(i))

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

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

Треугольник - это многоугольник с 3 сторонами. Итак, мы можем создать класс Triangle, который наследуется от Polygon. Это делает все атрибуты класса Polygon доступными для класса Triangle.

Нам не нужно определять их снова (возможность повторного использования кода). Треугольник можно определить следующим образом.

 class Triangle(Polygon): def __init__(self): Polygon.__init__(self,3) def findArea(self): a, b, c = self.sides # calculate the semi-perimeter s = (a + b + c) / 2 area = (s*(s-a)*(s-b)*(s-c)) ** 0.5 print('The area of the triangle is %0.2f' %area)

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

 >>> t = Triangle() >>> t.inputSides() Enter side 1 : 3 Enter side 2 : 5 Enter side 3 : 4 >>> t.dispSides() Side 1 is 3.0 Side 2 is 5.0 Side 3 is 4.0 >>> t.findArea() The area of the triangle is 6.00

Мы видим, что, хотя мы не определили такие методы, как inputSides()или dispSides()для класса, Triangleотдельно, мы смогли их использовать.

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

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

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

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

Лучшим вариантом было бы использование встроенной функции super(). Таким образом, super().__init__(3)эквивалентно Polygon.__init__(self,3)и является предпочтительным. Чтобы узнать больше о super()функции в Python, посетите функцию 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

Интересные статьи...