Klasy abstrakcyjne w Pythonie
Klasy abstrakcyjne są przeznaczone do wydzielenia funkcjonalności, która będzie następnie implementowana w klasach, które dziedziczą po klasie abstrakcyjnej.
Przypuśćmy, że mamy klasę Employee opisującą pracownika oraz klasę Manager, która jest klasą potomną względem klasy Employee. Chcemy utworzyć nową klasę Intern, która będzie opisywać osoby odbywające staż w firmie. Klasa Intern nie należy do wcześniej utworzonych klas Employee oraz Manager, jednak dzieli z nimi pewne atrybuty i metody.
W celu wydzielenia wspólnej funkcjonalności dla wszystkich powyższych klas tworzę klasę Person, która będzie zawierać metodę init() oraz metodę get_full_name(). Będą to metody abstrakcyjne. tzn.
import abc class Person(abc.ABC): ''' Abstract Person class ''' @abc.abstractmethod def __init__(self, first, last): self.first = first self.last = last @abc.abstractmethod def get_full_name(self): pass
Przykładowo klasa Employee będzie implementować powyższą klasę abstrakcyjną:
class Employee(Person): ''' Sample Employee class ''' def __init__(self, first, last, salary): super().__init__(first, last) self.salary = salary def get_full_name(self): return f'{self.__class__.__name__}: {self.first} {self.last}'
Próba utworzenia instancji z klasy abstrakcyjnej Person zakończy się natomiast wyrzuceniem wyjątku TypeError.
Również nie zaimplementowanie wszystkich metod abstrakcyjnych w klasie potomnej powoduje wyjątek TypeError.
źródło: www.slawomirkwiatkowski.pl