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ędnaCircle
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.