Các lớp trừu tượng trong Python
Bài viết này giải thích các lớp trừu tượng trong Python.
Chúng ta sẽ giải thích cơ chế cơ bản của các lớp trừu tượng sử dụng module abc
, cung cấp các ví dụ thực tế và mô tả tất cả với mã kèm theo.
YouTube Video
Các lớp trừu tượng trong Python
Module abc
của Python (Abstract Base Classes) là một phần của thư viện chuẩn và được sử dụng để định nghĩa các lớp trừu tượng, cung cấp một mẫu cho các phương thức mà một lớp nên triển khai. Sử dụng module này tăng cường tính linh hoạt và độ bền vững trong thiết kế lớp.
Lớp trừu tượng là gì?
Các lớp trừu tượng là các lớp được sử dụng để định nghĩa một giao diện chung cho các lớp cụ thể (có thể khởi tạo). Các lớp trừu tượng không thể tự khởi tạo; một triển khai thực tế phải được cung cấp trong các lớp dẫn xuất (lớp con).
Module abc
cho phép bạn định nghĩa các phương thức hoặc thuộc tính trừu tượng và ép buộc triển khai chúng trong các lớp thừa kế. Nếu thậm chí có một phương thức trừu tượng chưa được triển khai, lớp sẽ không thể được khởi tạo.
Cách sử dụng module abc
Để tạo một lớp trừu tượng sử dụng module abc
, kế thừa từ lớp ABC
và định nghĩa các phương thức trừu tượng bằng cách sử dụng bộ trang trí @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!"
Tại đây, lớp Animal
được định nghĩa như một lớp trừu tượng và bao gồm một phương thức trừu tượng gọi là sound
. Phương thức này phải được triển khai cụ thể trong các lớp con. Dog
và Cat
kế thừa từ Animal
và mỗi lớp triển khai phương thức sound
.
Khởi tạo các lớp trừu tượng
Các lớp trừu tượng không thể được khởi tạo trực tiếp. Ví dụ, cố gắng khởi tạo lớp Animal
sẽ dẫn đến lỗi.
1animal = Animal() # TypeError: Can't instantiate abstract class Animal with abstract methods sound
- Khi cố gắng khởi tạo một lớp trừu tượng, Python xác định rằng có các phương thức trừu tượng chưa được triển khai và gây ra lỗi
TypeError
. Nếu tất cả các phương thức trừu tượng cần thiết đã được triển khai trong lớp con, việc khởi tạo sẽ trở nên khả thi.
Nhiều phương thức trừu tượng
Một lớp cũng có thể có nhiều phương thức trừu tượng. Trừ khi tất cả các phương thức trừu tượng được triển khai trong một lớp con, lớp đó vẫn sẽ là một lớp trừu tượng.
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"
Trong ví dụ này, lớp Vehicle
có hai phương thức trừu tượng, và lớp Car
chỉ có thể được khởi tạo sau khi triển khai cả hai phương thức.
Định nghĩa Thuộc tính Trừu tượng
Mô-đun abc
không chỉ hỗ trợ các phương thức trừu tượng mà còn hỗ trợ các thuộc tính trừu tượng. Điều này cho phép áp đặt việc triển khai các thuộc tính trong các lớp dẫn xuất.
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)
- Trong ví dụ này, lớp
Shape
có một thuộc tính trừu tượngarea
, và lớp conCircle
hiện thực hóa thuộc tính này. Bằng cách này, sử dụng các lớp trừu tượng để áp đặt việc triển khai thuộc tính giúp duy trì tính nhất quán của mã.
Sử dụng isinstance()
và issubclass()
Bằng cách sử dụng các lớp trừu tượng, bạn có thể xác nhận mối quan hệ kế thừa lớp với isinstance()
hoặc issubclass()
, cải thiện tính an toàn và linh hoạt của mã.
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()
được sử dụng để kiểm tra xem một đối tượng có phải là một thể hiện của một lớp cụ thể hay không, và issubclass()
được sử dụng để kiểm tra xem một lớp có phải là lớp con của một lớp cụ thể không.
Tóm tắt
Bằng cách thiết kế các lớp trừu tượng sử dụng mô-đun abc
, bạn có thể làm rõ giao diện giữa các lớp và áp đặt việc triển khai các phương thức và thuộc tính cần thiết. Điều này giúp duy trì tính nhất quán của mã và giảm thiểu lỗi, làm cho nó đặc biệt hữu ích cho các dự án quy mô lớn.
Các lớp trừu tượng là một công cụ quan trọng trong Python giúp hỗ trợ lập trình hướng đối tượng linh hoạt, nâng cao khả năng tái sử dụng và duy trì của lớp.
Bạn có thể làm theo bài viết trên bằng cách sử dụng Visual Studio Code trên kênh YouTube của chúng tôi. Vui lòng ghé thăm kênh YouTube.