Nasljeđivanje Pythona (s primjerima)

Nasljeđivanje omogućuje nam definiranje klase koja uzima sve funkcionalnosti od roditeljske klase i omogućuje nam dodavanje više. U ovom vodiču naučit ćete koristiti nasljeđivanje u Pythonu.

Video: Python nasljeđivanje

Nasljeđivanje u Pythonu

Nasljeđivanje je snažna značajka u objektno orijentiranom programiranju.

Odnosi se na definiranje nove klase s malo ili nimalo preinaka postojeće klase. Nova klasa naziva se izvedena (ili podređena) klasa, a ona iz koje nasljeđuje naziva se osnovna (ili roditeljska) klasa .

Sintaksa nasljeđivanja Pythona

 class BaseClass: Tijelo klase osnovne klase DerivedClass (BaseClass): Tijelo izvedene klase

Izvedena klasa nasljeđuje značajke iz osnovne klase gdje joj se mogu dodati nove značajke. To rezultira ponovnom uporabljivošću koda.

Primjer nasljeđivanja u Pythonu

Da pokažemo upotrebu nasljedstva, uzmimo primjer.

Poligon je zatvorena figura s 3 ili više stranica. Recimo, imamo klasu koja se naziva Polygondefinirana kako slijedi.

 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))

Ova klasa ima atribute podataka za pohranjivanje broja stranica n i veličine svake strane kao popis koji se naziva stranice.

inputSides()Metoda uzima u veličini svake strane i dispSides()prikazuje te duljine stranica.

Trokut je mnogougao s 3 stranice. Dakle, možemo stvoriti klasu nazvanu Trokut koja nasljeđuje od Poligona. To čini sve atribute klase Polygon dostupnima klasi Triangle.

Ne trebamo ih ponovno definirati (ponovna upotreba koda). Trokut se može definirati kako slijedi.

 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)

Međutim, klasa Triangleima novu metodu findArea()za pronalaženje i ispis područja trokuta. Evo primjera izvođenja.

 >>> 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

Možemo vidjeti da, iako nismo zasebno definirali metode poput inputSides()ili dispSides()za nastavu Triangle, mogli smo ih koristiti.

Ako se atribut ne pronađe u samoj klasi, pretraživanje se nastavlja na osnovnu klasu. To se ponavlja rekurzivno, ako je osnovna klasa sama izvedena iz drugih klasa.

Nadjačavanje metode u Pythonu

U gornjem primjeru, primijetite da je __init__()metoda definirana u obje klase, Trokut kao i Poligon. Kada se to dogodi, metoda u izvedenoj klasi poništava onu u osnovnoj klasi. To će reći, __init__()u Trokutu dobiva prednost nad __init__u Poligonu.

Općenito kada nadjačavamo osnovnu metodu, nastojimo proširiti definiciju, a ne je jednostavno zamijeniti. Isto se radi pozivanjem metode u osnovnoj klasi iz one u izvedenoj klasi (pozivanje Polygon.__init__()iz __init__()u Triangle).

Bolja opcija bila bi upotreba ugrađene funkcije super(). Dakle, super().__init__(3)ekvivalentno je Polygon.__init__(self,3)i preferira se. Da biste saznali više o super()funkciji u Pythonu, posjetite Python super () funkciju.

Dvije ugrađene funkcije isinstance()i issubclass()koriste se za provjeru nasljeđivanja.

Funkcija se isinstance()vraća Trueako je objekt primjer klase ili drugih klasa izvedenih iz nje. Svaka klasa u Pythonu nasljeđuje od osnovne klase object.

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

Slično tome, issubclass()koristi se za provjeru nasljeđivanja klase.

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

Zanimljivi članci...