Python-arv (med eksempler)

Arv gjør det mulig for oss å definere en klasse som tar all funksjonaliteten fra en overordnet klasse og lar oss legge til mer. I denne opplæringen lærer du å bruke arv i Python.

Video: Python Arv

Arv i Python

Arv er en kraftig funksjon i objektorientert programmering.

Det refererer til å definere en ny klasse med liten eller ingen endring av en eksisterende klasse. Den nye klassen kalles avledet (eller underordnet) klasse, og den den arver fra kalles basisklassen .

Python Arv Syntaks

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

Avledet klasse arver funksjoner fra basisklassen der nye funksjoner kan legges til den. Dette resulterer i gjenbrukbarhet av koden.

Eksempel på arv i Python

La oss ta et eksempel for å demonstrere bruken av arv.

En polygon er en lukket figur med 3 eller flere sider. Si, vi har en klasse som heter Polygondefinert 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 klassen har dataegenskaper for å lagre antall sider n og størrelsen på hver side som en liste kalt sider.

Den inputSides()metoden tar i størrelsen på hver side, og dispSides()viser disse sidelengder.

En trekant er en polygon med 3 sider. Så vi kan lage en klasse som heter Triangle og arver fra Polygon. Dette gjør alle attributtene til Polygon-klassen tilgjengelig for Triangle-klassen.

Vi trenger ikke definere dem igjen (gjenbrukbar kode). 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)

Imidlertid har klassen Triangleen ny metode for findArea()å finne og skrive ut området av trekanten. Her er en prøvekjøring.

 >>> 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 selv om vi ikke definerte metoder som inputSides()eller dispSides()for klasse Trianglehver for seg, var vi i stand til å bruke dem.

Hvis et attributt ikke blir funnet i selve klassen, fortsetter søket til basisklassen. Dette gjentas rekursivt hvis baseklassen selv er avledet fra andre klasser.

Metodeoverstyring i Python

I eksemplet ovenfor, legg merke til at __init__()metoden ble definert i begge klasser, Triangle samt Polygon. Når dette skjer, overstyrer metoden i den avledede klassen den i basisklassen. Dette er å si, __init__()i Triangle får preferanse fremfor __init__i Polygon.

Generelt når vi overstyrer en basemetode, pleier vi å utvide definisjonen i stedet for bare å erstatte den. Det samme gjøres ved å kalle metoden i basisklassen fra den i avledet klasse (kaller Polygon.__init__()fra __init__()inn Triangle).

Et bedre alternativ ville være å bruke den innebygde funksjonen super(). Så, super().__init__(3)tilsvarer Polygon.__init__(self,3)og foretrekkes. For å lære mer om super()funksjonen i Python, besøk Python super () -funksjonen.

To innebygde funksjoner isinstance()og issubclass()brukes til å sjekke arv.

Funksjonen isinstance()returnerer Truehvis objektet er en forekomst av klassen eller andre klasser avledet fra 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()brukes til å sjekke om klassearv.

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

Interessante artikler...