Một Abstract Base Class (ABC) trong Python là một lớp không thể được khởi tạo trực tiếp và được dự định để được kế thừa. ABCs phục vụ như những bản thiết kế cho các lớp khác bằng cách cung cấp một giao diện chung mà tất cả các lớp con phải triển khai.
Chúng là một phần cơ bản của object-oriented programming in Python giúp các nhà phát triển định nghĩa và thi hành một API nhất quán cho một nhóm các lớp liên quan.
Dưới đây là cái nhìn sâu sắc về mục đích và chức năng của Abstract Base Classes of Python −
Abstract Base Class (ABC) cho phép chúng ta định nghĩa một bản thiết kế cho các lớp khác. Bản thiết kế này đảm bảo rằng bất kỳ lớp nào kế thừa từ Abstract Base Class (ABC) đều thực hiện một số phương thức nhất định bằng cách cung cấp một giao diện nhất quán.
Dưới đây là mã ví dụ về việc định nghĩa giao diện chuẩn của Lớp Cơ sở Trừu tượng trong Python −
from abc import ABC, abstractmethod class Shape(ABC): @abstractmethod def area(self): pass @abstractmethod def perimeter(self): pass
Khi một lớp kế thừa từ một Abstract Base Class (ABC) , nó phải triển khai tất cả abstract methods . Nếu không, Python sẽ phát sinh lỗi TypeError. Dưới đây là ví dụ về việc thực thi việc triển khai của Lớp Cơ sở Trừu tượng trong Python −
class Rectangle(Shape): def __init__(self, width, height): self.width = width self.height = height def area(self): return self.width * self.height def perimeter(self): return 2 * (self.width + self.height) # This will work rect = Rectangle(5, 10) # This will raise TypeError class IncompleteShape(Shape): pass
Abstract Base Class (ABC) hữu ích trong các dự án lớn nơi nhiều nhà phát triển có thể làm việc trên các phần khác nhau của mã nguồn. Chúng cung cấp một mẫu rõ ràng để các nhà phát triển tuân theo, đảm bảo tính nhất quán và giảm thiểu lỗi.
Abstract Base Class (ABC) cho phép tính đa hình bằng cách cho phép phát triển mã có thể hoạt động với các đối tượng từ các lớp khác nhau miễn là chúng tuân theo một giao diện cụ thể. Khả năng này giúp đơn giản hóa việc mở rộng và bảo trì mã.
Dưới đây là ví dụ về việc hỗ trợ tính đa hình trong lớp cơ sở trừu tượng của Python −
def print_shape_info(shape: Shape): print(f"Area: {shape.area()}") print(f"Perimeter: {shape.perimeter()}") square = Rectangle(4, 4) print_shape_info(square)
Note: Để thực thi các đoạn mã ví dụ đã đề cập ở trên, cần phải định nghĩa giao diện tiêu chuẩn và thực thi bắt buộc.
Abstract Base Classes (ABCs) trong Python bao gồm một số thành phần chính cho phép chúng định nghĩa và thực thi các giao diện cho các lớp con.
Các thành phần này bao gồm lớp ABC, bộ trang trí abstractmethod và một số thành phần khác giúp tạo và quản lý các lớp cơ sở trừu tượng. Dưới đây là các thành phần chính của Lớp Cơ Sở Trừu Tượng −
Ví dụ sau đây cho thấy cách mà ABCs (Abstract Base Classes) thực thi việc triển khai phương thức, hỗ trợ polymorphism và cung cấp một giao diện rõ ràng và nhất quán cho các lớp liên quan.
from abc import ABC, abstractmethod class Shape(ABC): @abstractmethod def area(self): pass @abstractmethod def perimeter(self): pass def description(self): return "I am a shape." class Rectangle(Shape): def __init__(self, width, height): self.width = width self.height = height def area(self): return self.width * self.height def perimeter(self): return 2 * (self.width + self.height) class Circle(Shape): def __init__(self, radius): self.radius = radius def area(self): import math return math.pi * self.radius ** 2 def perimeter(self): import math return 2 * math.pi * self.radius def print_shape_info(shape): print(shape.description()) print(f"Area: {shape.area()}") print(f"Perimeter: {shape.perimeter()}") shapes = [Rectangle(5, 10), Circle(7)] for shape in shapes: print_shape_info(shape) print("-" * 20) class IncompleteShape(Shape): pass try: incomplete_shape = IncompleteShape() except TypeError as e: print(e)
Khi thực thi đoạn mã trên, chúng ta sẽ nhận được đầu ra sau:
I am a shape. Area: 50 Perimeter: 30 -------------------- I am a shape. Area: 153.93804002589985 Perimeter: 43.982297150257104 -------------------- Can't instantiate abstract class IncompleteShape with abstract methods area, perimeter