Наследяването ни позволява да дефинираме клас, който взема цялата функционалност от родителски клас и ни позволява да добавяме повече. В този урок ще се научите да използвате наследяване в 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