Abstrakte klasser i Python
Denne artikkelen forklarer abstrakte klasser i Python.
Vi vil forklare den grunnleggende mekanismen for abstrakte klasser ved å bruke abc
-modulen, gi praktiske eksempler, og beskrive alt med medfølgende kode.
YouTube Video
Abstrakte klasser i Python
Pythons abc
-modul (Abstract Base Classes) er en del av standardbiblioteket og brukes til å definere abstrakte klasser, og gir en mal for metoder som en klasse skal implementere. Å bruke denne modulen øker fleksibiliteten og robustheten i klasseutforming.
Hva er en abstrakt klasse?
Abstrakte klasser er klasser som brukes til å definere et felles grensesnitt for konkrete (instansierbare) klasser. Abstrakte klasser kan ikke instansieres selv; en konkret implementering må gis i avledede (sub)klasser.
abc
-modulen lar deg definere abstrakte metoder eller egenskaper og kreve deres implementering i de arvende klassene. Hvis bare én abstrakt metode ikke er implementert, kan klassen ikke instansieres.
Hvordan bruke abc
-modulen
For å opprette en abstrakt klasse ved hjelp av abc
-modulen, arver du fra ABC
-klassen og definerer abstrakte metoder ved å bruke @abstractmethod
-dekoren.
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!"
Her er Animal
-klassen definert som en abstrakt klasse og inkluderer en abstrakt metode kalt sound
. Denne metoden må implementeres konkret i subklasser. Dog
og Cat
arver fra Animal
og implementerer hver sin sound
-metode.
Instansiering av abstrakte klasser
Abstrakte klasser kan ikke instansieres direkte. For eksempel, å forsøke å instansiere Animal
-klassen selv vil føre til en feil.
1animal = Animal() # TypeError: Can't instantiate abstract class Animal with abstract methods sound
- Når man prøver å instansiere en abstrakt klasse, avgjør Python at det finnes uimplementerte abstrakte metoder og kaster en
TypeError
. Hvis alle nødvendige abstrakte metoder er implementert i subklassen, blir instansiering mulig.
Flere abstrakte metoder
Det er også mulig for en klasse å ha flere abstrakte metoder. Med mindre alle abstrakte metoder er implementert i en subklasse, forblir klassen en abstrakt klasse.
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"
I dette eksemplet har Vehicle
-klassen to abstrakte metoder, og Car
-klassen kan bare instansieres etter at begge metodene er implementert.
Definere abstrakte egenskaper
abc
-modulen støtter ikke bare abstrakte metoder, men også abstrakte egenskaper. Dette gjør det mulig å håndheve implementeringen av egenskaper i avledede klasser.
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)
- I dette eksemplet har
Shape
-klassen en abstrakt egenskaparea
, og underklassenCircle
konkretiserer denne egenskapen. På denne måten bidrar bruken av abstrakte klasser til å opprettholde kodeskonsistens ved å håndheve implementering av egenskaper.
Bruke isinstance()
og issubclass()
Ved å bruke abstrakte klasser kan du bekrefte klassearvforhold med isinstance()
eller issubclass()
, noe som forbedrer kodesikkerhet og fleksibilitet.
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()
brukes til å sjekke om et objekt er en instans av en spesifisert klasse, og issubclass()
brukes til å sjekke om en klasse er en underklasse av en spesifisert klasse.
Sammendrag
Ved å designe abstrakte klasser ved hjelp av abc
-modulen kan du klargjøre grensesnittet mellom klasser og håndheve implementeringen av nødvendige metoder og egenskaper. Dette bidrar til å opprettholde kodeskonsistens og reduserer feil, noe som gjør det spesielt nyttig for storskala prosjekter.
Abstrakte klasser er et viktig verktøy i Python som støtter fleksibel objektorientert programmering og forbedrer gjenbrukbarhet og vedlikeholdbarhet av klasser.
Du kan følge med på artikkelen ovenfor ved å bruke Visual Studio Code på vår YouTube-kanal. Vennligst sjekk ut YouTube-kanalen.