Các lớp trừu tượng trong Python

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. DogCat 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ượng area, và lớp con Circle 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()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.

YouTube Video