Наследяване на 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__()методът е дефиниран и в двата класа, Триъгълник, както и Полигон. Когато това се случи, методът в производния клас заменя този в базовия клас. Това ще рече, че __init__()в Triangle получава предпочитание пред в __init__в Polygon.

Като цяло, когато заместваме базовия метод, ние сме склонни да разширяваме дефиницията, а не просто да я заместваме. Същото се прави чрез извикване на метода в базовия клас от този в производен клас (извикване 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

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