目录
1. 简介
抽象基类(Abstract Base Classes,ABCs)是一种特殊的类,它声明了一组方法和属性,但不完全实现它们。这些类不能被实例化,其主要目的是被继承和实现。通过定义一个或多个抽象方法,ABCs为子类提供了一个框架,要求子类实现特定的方法或属性。
抽象基类有助于确保子类具有一致的接口设计。这意味着所有继承自同一个抽象基类的子类都将实现相同的方法和属性,从而实现了接口的一致性和可预测性。这种模式特别适用于需要多种实现相同接口的场景,如插件系统、策略模式等。
2. 抽象基类的使用
Python中的抽象基类可以通过 abc
模块实现。以下是一个简单的示例:
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
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)
在上述代码中,Shape
类是一个抽象基类,它定义了两个抽象方法:area
和 perimeter
。这意味着任何继承 Shape
的类都必须实现这两个方法,否则将无法进行实例化。
注意,定义抽象基类也可以通过指定元类为 ABCMeta
来实现:
from abc import ABCMeta, abstractmethod
class Shape(metaclass=ABCMeta):
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
事实上,ABC
的源码为:
class ABC(metaclass=ABCMeta):
"""Helper class that provides a standard way to create an ABC using
inheritance.
"""
__slots__ = ()
所以一般都是通过继承 ABC
来实现抽象基类。
@abstractmethod
还能注解静态方法、类方法和property,只需要保证这个注解紧靠在函数定义前即可:
class A(metaclass=ABCMeta):
@property
@abstractmethod
def name(self):
pass
@name.setter
@abstractmethod
def name(self, value):
pass
@classmethod
@abstractmethod
def method1(cls):
pass
@staticmethod
@abstractmethod
def method2():
pass
Ref
[1] https://docs.python.org/zh-cn/3/library/abc.html
[2] https://python3-cookbook.readthedocs.io/zh-cn/latest/c08/p12_define_interface_or_abstract_base_class.html
[3] https://zhuanlan.zhihu.com/p/89549054
[4] https://github.com/houluy/It-is-not-only-Python/blob/master/Object_Oriented/object_oriented23.md