Các lớp trừu tượng là các lớp chứa một hoặc nhiều phương thức trừu tượng. Một phương thức trừu tượng là một phương thức được khai báo, nhưng không chứa phần thực thi. Các lớp trừu tượng không thể được khởi tạo và yêu cầu các lớp con cung cấp các triển khai cho các phương thức trừu tượng
Bạn có thể thấy điều này trong các ví dụ sau
class AbstractClass: def do_something[self]: pass class B[AbstractClass]: pass a = AbstractClass[] b = B[]
Nếu chúng ta bắt đầu chương trình này, chúng ta sẽ thấy rằng đây không phải là một lớp trừu tượng, bởi vì
- chúng ta có thể khởi tạo một thể hiện từ
- chúng tôi không bắt buộc phải triển khai do_something trong định nghĩa lớp của B
Ví dụ của chúng tôi đã triển khai một trường hợp kế thừa đơn giản không liên quan gì đến một lớp trừu tượng. Trên thực tế, bản thân Python không cung cấp các lớp trừu tượng. Tuy nhiên, Python đi kèm với một mô-đun cung cấp cơ sở hạ tầng để xác định Lớp cơ sở trừu tượng [ABC]. Mô-đun này được gọi là - vì những lý do rõ ràng - abc
Đoạn mã Python sau sử dụng mô-đun abc và định nghĩa một lớp cơ sở trừu tượng
from abc import ABC, abstractmethod class AbstractClassExample[ABC]: def __init__[self, value]: self.value = value super[].__init__[] @abstractmethod def do_something[self]: pass
Bây giờ chúng ta sẽ định nghĩa một lớp con bằng cách sử dụng lớp trừu tượng đã định nghĩa trước đó. Bạn sẽ nhận thấy rằng chúng tôi chưa triển khai phương thức do_something, mặc dù chúng tôi bắt buộc phải triển khai nó, bởi vì phương thức này được trang trí như một phương thức trừu tượng với trình trang trí "abstractmethod". Chúng tôi nhận được một ngoại lệ là không thể khởi tạo DoAdd42
class DoAdd42[AbstractClassExample]: pass x = DoAdd42[4]
ĐẦU RA
--------------------------------------------------------------------------- TypeError Traceback [most recent call last] in 2 pass 3 ----> 4 x = DoAdd42[4] TypeError: Can't instantiate abstract class DoAdd42 with abstract methods do_something
Chúng ta sẽ làm đúng cách trong ví dụ sau, trong đó chúng ta định nghĩa hai lớp kế thừa từ lớp trừu tượng của chúng ta
class DoAdd42[AbstractClassExample]: def do_something[self]: return self.value + 42 class DoMul42[AbstractClassExample]: def do_something[self]: return self.value * 42 x = DoAdd42[10] y = DoMul42[10] print[x.do_something[]] print[y.do_something[]]
ĐẦU RA
52 420
Một lớp bắt nguồn từ một lớp trừu tượng không thể được khởi tạo trừ khi tất cả các phương thức trừu tượng của nó bị ghi đè
Bạn có thể nghĩ rằng các phương thức trừu tượng không thể được triển khai trong lớp cơ sở trừu tượng. ấn tượng này là sai. Một phương thức trừu tượng có thể có một triển khai trong lớp trừu tượng. Ngay cả khi chúng được triển khai, người thiết kế các lớp con sẽ buộc phải ghi đè việc triển khai. Giống như trong các trường hợp kế thừa "bình thường" khác, phương thức trừu tượng có thể được gọi bằng cơ chế gọi super[]. Điều này cho phép cung cấp một số chức năng cơ bản trong phương thức trừu tượng, có thể được làm phong phú thêm bằng cách triển khai lớp con