Klasy abstrakcyjne w Pythonie

Klasy abstrakcyjne w Pythonie

Ten artykuł wyjaśnia klasy abstrakcyjne w Pythonie.

Wyjaśnimy podstawowy mechanizm działania klas abstrakcyjnych z użyciem modułu abc, podamy praktyczne przykłady i opiszemy wszystko z odpowiednim kodem.

YouTube Video

Klasy abstrakcyjne w Pythonie

Moduł abc (Abstract Base Classes) w Pythonie jest częścią biblioteki standardowej i służy do definiowania klas abstrakcyjnych, dostarczając wzorzec metod, które klasa powinna zaimplementować. Użycie tego modułu zwiększa elastyczność i solidność projektu klas.

Czym jest klasa abstrakcyjna?

Klasy abstrakcyjne to klasy używane do definiowania wspólnego interfejsu dla konkretnych (instancjonowalnych) klas. Klasy abstrakcyjne nie mogą być instancjonowane; konieczne jest dostarczenie konkretnej implementacji w klasach pochodnych (podklasach).

Moduł abc pozwala na definiowanie metod lub właściwości abstrakcyjnych i wymusza ich implementację w klasach dziedziczących. Jeśli choć jedna metoda abstrakcyjna nie zostanie zaimplementowana, klasa nie może być instancjonowana.

Jak używać modułu abc

Aby utworzyć klasę abstrakcyjną z użyciem modułu abc, dziedzicz po klasie ABC i definiuj metody abstrakcyjne za pomocą dekoratora @abstractmethod.

 1from abc import ABC, abstractmethod
 2
 3# Definition of the abstract base class
 4class Animal(ABC):
 5
 6    @abstractmethod
 7    def sound(self):
 8        pass
 9
10# Concrete implementation in the subclass
11class Dog(Animal):
12    def sound(self):
13        return "Woof!"
14
15class Cat(Animal):
16    def sound(self):
17        return "Meow!"

Tutaj klasa Animal jest zdefiniowana jako klasa abstrakcyjna i zawiera metodę abstrakcyjną o nazwie sound. Ta metoda musi być konkretnie zaimplementowana w podklasach. Dog i Cat dziedziczą po Animal i każda z nich implementuje metodę sound.

Instancjonowanie klas abstrakcyjnych

Klasy abstrakcyjne nie mogą być instancjonowane bezpośrednio. Na przykład próba instancjonowania klasy Animal zakończy się błędem.

1animal = Animal()  # TypeError: Can't instantiate abstract class Animal with abstract methods sound
  • Podczas próby instancjonowania klasy abstrakcyjnej Python wykryje, że istnieją niezrealizowane metody abstrakcyjne i zgłosi TypeError. Jeśli wszystkie wymagane metody abstrakcyjne zostaną zaimplementowane w podklasie, instancjonowanie stanie się możliwe.

Wiele metod abstrakcyjnych

Klasa może również zawierać wiele metod abstrakcyjnych. Dopóki wszystkie metody abstrakcyjne nie zostaną zaimplementowane w podklasie, klasa pozostaje klasą abstrakcyjną.

 1from abc import ABC, abstractmethod
 2
 3class Vehicle(ABC):
 4
 5    @abstractmethod
 6    def start_engine(self):
 7        pass
 8
 9    @abstractmethod
10    def stop_engine(self):
11        pass
12
13class Car(Vehicle):
14    def start_engine(self):
15        return "Car engine started"
16
17    def stop_engine(self):
18        return "Car engine stopped"

W tym przykładzie klasa Vehicle ma dwie metody abstrakcyjne, a klasa Car może być zinstancjonowana dopiero po zaimplementowaniu obu metod.

Definiowanie właściwości abstrakcyjnych

Moduł abc obsługuje nie tylko metody abstrakcyjne, ale także właściwości abstrakcyjne. Pozwala to wymusić implementację właściwości w klasach pochodnych.

 1from abc import ABC, abstractmethod
 2
 3class Shape(ABC):
 4
 5    @property
 6    @abstractmethod
 7    def area(self):
 8        pass
 9
10class Circle(Shape):
11    def __init__(self, radius):
12        self.radius = radius
13
14    @property
15    def area(self):
16        return 3.14159 * (self.radius ** 2)
  • W tym przykładzie klasa Shape ma właściwość abstrakcyjną area, a klasa podrzędna Circle definiuje konkretną implementację tej właściwości. W ten sposób korzystanie z klas abstrakcyjnych do wymuszania implementacji właściwości pomaga utrzymać spójność kodu.

Korzystanie z isinstance() i issubclass()

Korzystając z klas abstrakcyjnych, można potwierdzić relacje dziedziczenia klas za pomocą isinstance() lub issubclass(), co poprawia bezpieczeństwo i elastyczność kodu.

 1from abc import ABC, abstractmethod
 2
 3# Definition of the abstract base class
 4class Animal(ABC):
 5
 6    @abstractmethod
 7    def sound(self):
 8        pass
 9
10# Concrete implementation in the subclass
11class Dog(Animal):
12    def sound(self):
13        return "Woof!"
14
15class Cat(Animal):
16    def sound(self):
17        return "Meow!"
18
19class Vehicle(ABC):
20
21    @abstractmethod
22    def start_engine(self):
23        pass
24
25    @abstractmethod
26    def stop_engine(self):
27        pass
28
29class Car(Vehicle):
30    def start_engine(self):
31        return "Car engine started"
32
33    def stop_engine(self):
34        return "Car engine stopped"
35
36print("Dog() is an Animal? -> ", isinstance(Dog(), Animal))   # True
37print("Dog is subclass of Animal? -> ", issubclass(Dog, Animal))  # True
38print("Cat() is a Vehicle? -> ", isinstance(Cat(), Vehicle))  # False

isinstance() służy do sprawdzania, czy obiekt jest instancją określonej klasy, a issubclass() do sprawdzania, czy klasa jest klasą pochodną względem określonej klasy.

Podsumowanie

Tworząc klasy abstrakcyjne przy użyciu modułu abc, możesz uwidocznić interfejs pomiędzy klasami i wymusić implementację wymaganych metod i właściwości. Pomaga to utrzymać spójność kodu i zmniejsza liczbę błędów, co czyni to szczególnie przydatnym w projektach na dużą skalę.

Klasy abstrakcyjne są ważnym narzędziem w Pythonie, które wspierają elastyczne programowanie obiektowe, zwiększając możliwość ponownego użycia i utrzymania klas.

Możesz śledzić ten artykuł, korzystając z Visual Studio Code na naszym kanale YouTube. Proszę również sprawdzić nasz kanał YouTube.

YouTube Video