Arv i Python

Arv är ett kraftfullt sätt att återanvända kod från redan existerande klasser.

Varför Arv?

Många gånger vill man återanvända kod från klasser man redan har programmerat. Istället för att programmera liknande klasser flera gånger, kan man ärva kod från en annan klass. En klass som ärver kod kallas för subklass och dess förälder för superklass. Det som är smidigt med arv är att subklassen får samma uppsättning av instansvariabler och metoder som superklassen, men det är även möjligt att lägga till nya metoder och klassvariabler om så önskas, som enbart är tillgängliga för subklassen.

Hur använder man arv i Python? – Exempel

För att visa hur arv i Python fungerar, ska vi programmera ett par fordon. Klassen vehicle (fordon), är superklassen och med hjälp av denna kan vi ärva fordonets egenskaper för att programmera subklasser, exempelvis en båt och en bil. Först bestämmer vi att alla fordon ska ha en färg, årsmodell samt en boolean som säger om fordonet är startad eller avstängd.

Vi har alltså skapat en superklass Vehicle som har en färg och en årsmodell. Klassen kan starta eller stängas av.

Vi skapar nu funktionen båt (boat):

Båten ärver alla egenskaper och funktioner från Vehicle, men får också funktionen att kunna segla.

På samma sätt skapar vi klassen bil (Car):

Bilen ärver alla egenskaper från Vehicle och får dessutom funktionen att köra framåt och egenskapen brand (modell). Observera att klassen Boat och klassen Car är helt oberoende av varandra.

Vi skapar nu ett objekt av typen Boat och ett objekt av typen Car:

Vi kan nu anropa klasserna på vanligt vis:

Kör framåt
Seglar

Men eftersom car och boat är helt fristående av varandra, kommer vi inte kunna anropa sail från car eller drive från boat:

Vilket innebär att programmet kraschar.

Men start_vehicle och stop_vehicle var ju definierade i superklassen! Det innebär att båda subklasserna kan använda dessa funktioner:

Vilket fungerar utmärkt!

På samma sätt är variablerna is_on och year definierade i superklassen. Alltså kan vi anropa dessa från båda subklasserna:

True
2000

Men parametern brand (modell) var ju en lokal inparameter vilket innebär att den bara är möjlig att kalla på från car:

XC60

Men inte från boat:

Bakåt    |    Framåt