Python - Abstract Base Classes

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.

Purpose of Abstract Base Classes

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

Defining a Standard Interface

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

Enforcing Implementation

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

Providing a Template for Future Development

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.

Facilitating Polymorphism

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.

Components of Abstract Base Classes

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 −

  • ABC Class: This class from Python's Abstract Base Classes (ABCs) module serves as the foundation for creating abstract base classes. Any class derived from ABC is considered an abstract base class.
  • 'abstractmethod' Decorator: This decorator from the abc module is used to declare methods as abstract. These methods do not have implementations in the ABC and must be overridden in derived classes.
  • 'ABCMeta' Metaclass: This is the metaclass used by ABC. It is responsible for keeping track of which methods are abstract and ensuring that instances of the abstract base class cannot be created if any abstract methods are not implemented.
  • Concrete Methods in ABCs: Abstract base classes can also define concrete methods that provide a default implementation. These methods can be used or overridden by subclasses.
  • Instantiation Restrictions: A key feature of ABCs is that they cannot be instantiated directly if they have any abstract methods. Attempting to instantiate an ABC with unimplemented abstract methods will raise a 'TypeError'.
  • Subclass Verification: Abstract Base Classes (ABCs) can verify if a given class is a subclass using the issubclass function and can check instances with the isinstance function.

Example of Abstract Base Classes in Python

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)  

Output

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