Một class gọi là Abstract class nếu chứa một hoặc nhiều abstract methods. Abstract method là method được khai báo nhưng không có implementation. Abstract class không thể khởi tạo (instantiated), và abstract methods của nó phải được implement bởi subclass.
Abstract base classes cung cấp cách định nghĩa interfaces khi các kỹ thuật khác như hasattr() cồng kềnh hoặc sai lệch (ví dụ với magic methods). ABCs giới thiệu virtual subclasses - class không kế thừa từ class nhưng vẫn được nhận diện bởi isinstance() và issubclass(). Python có nhiều built-in ABCs. ABCs cho cấu trúc dữ liệu (Iterator, Generator, Set, Mapping...) trong collections.abc. Module numbers định nghĩa numeric tower - tập hợp base classes cho numeric types. Module abc cung cấp infrastructure định nghĩa custom abstract base classes.
Module abc hoạt động bằng cách đánh dấu method của base class là abstract. Làm bằng decorator @abstractmethod. Concrete class (subclass của abstract base class) implement abstract base bằng cách override abstract methods.
Module abc định nghĩa class ABCMeta - metaclass để định nghĩa abstract base class. Ví dụ định nghĩa class Shape làm abstract base class dùng ABCMeta. Class Shape có method area() decorated by abstractmethod.
import abc
class Shape(metaclass=abc.ABCMeta):
@abc.abstractmethod
def area(self):
pass
class Rectangle(Shape):
def __init__(self, x, y):
self.l = x
self.b = y
def area(self):
return self.l * self.b
r = Rectangle(10, 20)
print('area: ', r.area())
Lưu ý: Abstract base class có thể có nhiều abstract method. Child class phải implement tất cả, nếu không TypeError sẽ ném ra.
Module abc cũng định nghĩa helper class ABC dùng thay cho ABCMeta trong định nghĩa abstract base class:
class Shape(abc.ABC):
@abc.abstractmethod
def area(self):
pass
Thay vì subclass từ abstract base class, có thể register làm abstract base bằng class decorator:
class Shape(abc.ABC):
@abc.abstractmethod
def area(self):
pass
@Shape.register
class Rectangle():
def __init__(self, x, y):
self.l = x
self.b = y
def area(self):
return self.l * self.b
Có thể cung cấp class methods và static methods trong abstract base class bằng decorators @abstractclassmethod và @abstractstaticmethod.