Python-arv (med exempel)

Arv gör det möjligt för oss att definiera en klass som tar all funktionalitet från en överordnad klass och tillåter oss att lägga till mer. I den här handledningen lär du dig att använda arv i Python.

Video: Python Arv

Arv i Python

Arv är en kraftfull funktion i objektorienterad programmering.

Det hänvisar till att definiera en ny klass med liten eller ingen modifiering av en befintlig klass. Den nya klassen kallas härledd (eller underordnad) klass och den som den ärver från kallas basklassen .

Python-arvssyntax

 klass BaseClass: Kropp av basklassklass DerivedClass (BaseClass): Kropp av härledd klass

Deriverad klass ärver funktioner från basklassen där nya funktioner kan läggas till den. Detta resulterar i återanvändning av koden.

Exempel på arv i Python

Låt oss ta ett exempel för att visa användningen av arv.

En polygon är en sluten figur med tre eller flera sidor. Säg, vi har en klass som heter Polygondefinierad enligt följande.

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

Denna klass har dataattribut för att lagra antalet sidor n och storleken på varje sida som en lista som kallas sidor.

Den inputSides()metod tar i storleken hos varje sida och dispSides()visar dessa sidolängder.

En triangel är en polygon med tre sidor. Så vi kan skapa en klass som heter Triangle och ärver från Polygon. Detta gör alla attribut för Polygon-klassen tillgängliga för triangelklassen.

Vi behöver inte definiera dem igen (kodåteranvändbarhet). Triangel kan definieras enligt följande.

 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 dock en ny metod för findArea()att hitta och skriva ut området för triangeln. Här är en provkörning.

 >>> 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 att även om vi inte definierade metoder som inputSides()eller dispSides()för klass Triangleseparat, kunde vi använda dem.

Om ett attribut inte hittas i själva klassen fortsätter sökningen till basklassen. Detta upprepas rekursivt, om basklassen själv härrör från andra klasser.

Metod Överstyrning i Python

Lägg märke till att i ovanstående exempel var __init__()metoden definierad i båda klasserna, triangel och polygon. När detta händer åsidosätter metoden i den härledda klassen den i basklassen. Detta är att säga, __init__()i Triangle får preferens framför __init__i Polygon.

Generellt när vi åsidosätter en basmetod tenderar vi att utöka definitionen snarare än att helt enkelt ersätta den. Samma görs genom att anropa metoden i basklassen från den i härledda klassen (anrop Polygon.__init__()från __init__()in Triangle).

Ett bättre alternativ skulle vara att använda den inbyggda funktionen super(). Så, super().__init__(3)motsvarar Polygon.__init__(self,3)och föredras. För att lära dig mer om super()funktionen i Python, besök Python super () -funktionen.

Två inbyggda funktioner isinstance()och issubclass()används för att kontrollera arv.

Funktionen isinstance()returneras Trueom objektet är en instans av klassen eller andra klasser härledda från den. Varje klass i Python ärver från basklassen object.

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

På samma sätt issubclass()används för att kontrollera om klassärv.

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

Intressanta artiklar...