Abstrakta klasser

Vi har tidigare sagt att klasser är som ritningar för objekt, abstrakta klasser (ABC) är i sin tur som ritningar för andra klasser.

Det går inte att skapa objekt med en abstrakt klass, syftet med dem är att definiera ett publikt gränssnitt (API) som subklasser måste implementera. I den abstrakta klassen definierar vi metoder utan någon implementation (abstrakta metoder). Sen måste subklasserna definiera och implementera dem. På detta sättet kan vi garantera att metoder som vi förväntar oss finns men det är upp till subklasserna att implementera funktionaliteten som är specifik för sin subklass.

#Skapa en abstrakt klass

Vi skapar klassen med hjälp av abc modulen och definierar abstrakta metoder med dekoratorn @abstractmethod.

Klassdiagram klasserna med arv och abstraktion.

Klassdiagram klasserna med arv och abstraktion.

from abc import ABC, abstractmethod
 
class Polygon(ABC):
 
    @abstractmethod # så här definierar vi att en method måste skapas
    def noofsides(self):
        pass
 
class Triangle(Polygon):
 
    # overriding abstract method
    def noofsides(self):
        print("I have 3 sides")
 
class Pentagon(Polygon):
 
    def noofsides(self):
        print("I have 5 sides")
 
class Hexagon(Polygon):
 
    def noofsides(self):
        print("I have 6 sides")
 
class Quadrilateral(Polygon):
 
    def noofsides(self):
        print("I have 4 sides")
 
>>> t = Triangle()
>>> t.noofsides()
I have 3 sides

>>> q = Quadrilateral()
>>> q.noofsides()
I have 5 sides

>>> p = Pentagon()
>>> p.noofsides()
I have 6 sides

>>> h = Hexagon()
>>> h.noofsides()
I have 4 sides

po = Polygon()
TypeError: Can't instantiate abstract class Polygon with abstract methods noofsides

Om vi skapar en till en klass som ärver av Polygon men inte implementerar den abstrakta metoden. Då får vi följande fel när vi försöker skapa ett objekt, TypeError: Can't instantiate abstract class NotShape with abstract methods noofsides.

I exemplet har vi bara en abstrakt metod men det går så klart att lägga till fler om man vill det.

#Revision history

  • 2022-01-20: (A, aar) Första versionen.

Document source.