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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *