Python-arv (med eksempler)

Arv giver os mulighed for at definere en klasse, der tager al funktionaliteten fra en overordnet klasse og giver os mulighed for at tilføje mere. I denne vejledning lærer du at bruge arv i Python.

Video: Python-arv

Arv i Python

Arv er en stærk funktion i objektorienteret programmering.

Det refererer til at definere en ny klasse med ringe eller ingen ændringer til en eksisterende klasse. Den nye klasse kaldes afledt (eller underordnet) klasse, og den, som den arver fra, kaldes basisklassen (eller forældren) .

Python-arvssyntaks

 klasse BaseClass: Body of base class class DerivedClass (BaseClass): Body of derivated class

Afledt klasse arver funktioner fra baseklassen, hvor nye funktioner kan føjes til den. Dette resulterer i genbrugelighed af kode.

Eksempel på arv i Python

Lad os tage et eksempel for at demonstrere brugen af ​​arv.

En polygon er en lukket figur med 3 eller flere sider. Sig, vi har en klasse kaldet Polygondefineret som følger.

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

Denne klasse har dataegenskaber til at gemme antallet af sider n og størrelsen af ​​hver side som en liste kaldet sider.

Den inputSides()metode tager i størrelsen af hver side og dispSides()viser disse sidelængder.

En trekant er en polygon med 3 sider. Så vi kan oprette en klasse kaldet trekant, som arver fra polygon. Dette gør alle attributter for Polygon-klassen tilgængelige for klassen Triangle.

Vi behøver ikke at definere dem igen (kode genanvendelighed). Trekant kan defineres som følger.

 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)

Klassen Trianglehar dog en ny metode findArea()til at finde og udskrive området i trekanten. Her er en prøvekørsel.

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

Vi kan se, at selvom vi ikke definerede metoder som inputSides()eller dispSides()for klasse Triangleseparat, var vi i stand til at bruge dem.

Hvis en attribut ikke findes i selve klassen, fortsætter søgningen til basisklassen. Dette gentages rekursivt, hvis basisklassen selv stammer fra andre klasser.

Metodeoverstyring i Python

I ovenstående eksempel bemærk, at __init__()metoden blev defineret i begge klasser, Triangle såvel som polygon. Når dette sker, tilsidesætter metoden i den afledte klasse den i basisklassen. Dette er at sige, __init__()i Triangle får præference over __init__i Polygon.

Generelt når vi tilsidesætter en basemetode, har vi en tendens til at udvide definitionen snarere end blot at erstatte den. Det samme gøres ved at kalde metoden i basisklassen fra den i afledte klasse (kald Polygon.__init__()fra __init__()ind Triangle).

En bedre mulighed ville være at bruge den indbyggede funktion super(). Så super().__init__(3)svarer til Polygon.__init__(self,3)og foretrækkes. For at lære mere om super()funktionen i Python, besøg Python super () -funktionen.

To indbyggede funktioner isinstance()og issubclass()bruges til at kontrollere arv.

Funktionen isinstance()vender tilbage, Truehvis objektet er en forekomst af klassen eller andre klasser afledt af den. Hver klasse i Python arver fra basisklassen object.

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

Tilsvarende issubclass()bruges til at kontrollere for klasse arv.

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

Interessante artikler...