Наследование Питона
Наследование Python
Наследование позволяет нам определить класс, который берет всю функциональность родительского класса и позволяет нам добавлять больше. В этом руководстве вы научитесь использовать наследование в Python.
Видео:наследование Python
Наследование в Python
Наследование — мощная функция объектно-ориентированного программирования.
Это относится к определению нового класса с небольшим изменением существующего класса или без него. Новый класс называется производным (или дочерним) классом. а тот, от которого он наследуется, называется базовым (или родительским) классом. .
<час>Синтаксис наследования Python
class BaseClass: Body of base class class DerivedClass(BaseClass): Body of derived class
Производный класс наследует функции базового класса, к которым могут быть добавлены новые функции. Это приводит к возможности повторного использования кода.
<час>Пример наследования в 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 а также Многоугольник . Когда это происходит, метод производного класса переопределяет метод базового класса. То есть __init__()
в треугольнике получает предпочтение перед __init__
в многоугольнике .
Обычно при переопределении базового метода мы склонны расширять определение, а не просто заменять его. То же самое делается путем вызова метода базового класса из метода производного класса (вызов Polygon.__init__()
из __init__()
в 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
Python