Python中的抽象基类(ABC)

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 类是一个抽象基类,它定义了两个抽象方法:areaperimeter。这意味着任何继承 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

相关推荐

  1. Python抽象ABC

    2024-04-10 13:58:04       42 阅读
  2. python抽象

    2024-04-10 13:58:04       30 阅读
  3. 、接口、抽象区别

    2024-04-10 13:58:04       36 阅读
  4. C++知识 抽象

    2024-04-10 13:58:04       58 阅读
  5. C++抽象

    2024-04-10 13:58:04       34 阅读
  6. python继承

    2024-04-10 13:58:04       40 阅读
  7. Python 抽象

    2024-04-10 13:58:04       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-10 13:58:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-10 13:58:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-10 13:58:04       82 阅读
  4. Python语言-面向对象

    2024-04-10 13:58:04       91 阅读

热门阅读

  1. adb remount

    2024-04-10 13:58:04       31 阅读
  2. Qt之线程的使用

    2024-04-10 13:58:04       34 阅读
  3. 【QT教程】QT6国际化

    2024-04-10 13:58:04       29 阅读
  4. 【前端】eslint 禁用命令

    2024-04-10 13:58:04       25 阅读
  5. CSS进阶

    CSS进阶

    2024-04-10 13:58:04      42 阅读
  6. TypeScript极速入门笔记1

    2024-04-10 13:58:04       40 阅读
  7. 【docker-compose】安装及配置

    2024-04-10 13:58:04       33 阅读