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 Polygon
definert 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 Triangle
en 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 Triangle
hver 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 True
hvis 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