python的抽象基类

在 Python 中,可以使用abc模块(Abstract Base Classes 的缩写)来定义抽象基类。abc模块提供了创建抽象基类的组件。

要定义一个抽象基类,需要使用ABCMeta作为元类,或者从ABC类派生。以下是两种常见的定义方式:

方式一:使用ABCMeta作为元类

from abc import ABCMeta

class MyABC(metaclass=ABCMeta):
    @abstractmethod
    def some_abstract_method(self):
        """ 抽象方法,无需实现具体逻辑 """
        pass

方式二:从ABC类派生

from abc import ABC

class MyABC(ABC):
    @abstractmethod
    def some_abstract_method(self):
        """ 抽象方法,无需实现具体逻辑 """
        pass

在上述代码中,定义了一个名为MyABC的抽象基类,其中包含了一个被@abstractmethod装饰的抽象方法some_abstract_method

抽象基类不能被实例化,只能被继承。子类必须实现父类中的抽象方法,否则子类也不能被实例化。

抽象基类的主要作用包括:

  • 为模块之间的调用提供清晰的接口,便于协同开发和理解代码功能。
  • 约束开发,确保子类按照规定实现特定的方法,保证代码的规范性和一致性。

例如,有一个子类继承了上述的抽象基类:

class MySubclass(MyABC):
    def some_abstract_method(self):
        # 实现抽象方法的具体逻辑
        print("实现了抽象方法")

这样,MySubclass就实现了抽象基类MyABC中的抽象方法some_abstract_method,可以被实例化和使用。

另外,collections.abc子模块中也提供了一些常用的抽象基类,可用于测试一个类或实例是否提供特定的接口,例如判断是否可哈希、是否为映射等。例如,可以使用isinstance函数结合collections.abc中的抽象基类来检查一个对象是否属于某种类型:

from collections.abc import Sized

obj = MyObject()
if isinstance(obj, Sized):
    # obj 是可确定大小的对象
    size = len(obj) 

这样可以使代码更加规范和具有可读性,并且能够统一处理类似的类型检查。

抽象基类就像是一个“模板”或者“蓝图”,但它自己是不完整的,不能直接被拿来用。比如说,有个“动物”的抽象基类,它可能规定了所有动物都得有“吃”和“睡”的能力,但不会具体说怎么吃、怎么睡。

它主要有两个大作用。

第一个作用是规范和统一。就像上面说的“动物”抽象基类规定了要有“吃”和“睡”的能力,那么继承它的子类,比如“狗”“猫”“牛”等等,都得有这两个能力,这样就保证了大家都遵循同样的规则,代码写起来更整齐、更有条理。

第二个作用是方便检查和识别。比如说,您有一堆不同的类,有的是“动物”的子类,有的不是。通过抽象基类,您能很容易地判断出哪些是“动物”相关的类,哪些不是,就像拿着一个标准去对照一样。

和普通类相比,普通类可以直接创建对象来使用,而抽象基类不行,它更像是给其他类定规矩的。

和接口的概念有点像,接口也是规定了一些方法,但在 Python 里没有像其他语言那样明确的“接口”概念,抽象基类在一定程度上起到了类似的作用。

再比如说和继承的关系,子类继承抽象基类,就得按照抽象基类定的规矩把那些没写具体的方法给补充完整,不然子类也不能正常工作。

总的来说,抽象基类就像是一个老大,给下面的小弟们定好了必须要做的事,让整个代码世界更有秩序。

总之,抽象基类通过定义抽象方法来规定子类必须实现的行为,有助于提高代码的设计质量和可维护性。在实际开发中,根据具体的需求和场景合理使用抽象基类,可以更好地组织和管理代码结构。

 

 

相关推荐

  1. python抽象

    2024-07-10 21:20:03       10 阅读
  2. Python抽象(ABC)

    2024-07-10 21:20:03       26 阅读
  3. 、接口、抽象区别

    2024-07-10 21:20:03       22 阅读
  4. C++知识 抽象

    2024-07-10 21:20:03       45 阅读
  5. python继承

    2024-07-10 21:20:03       28 阅读
  6. Python 抽象

    2024-07-10 21:20:03       23 阅读
  7. Python 数据库封装

    2024-07-10 21:20:03       20 阅读
  8. kotlin抽象抽象方法

    2024-07-10 21:20:03       36 阅读

最近更新

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

    2024-07-10 21:20:03       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 21:20:03       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 21:20:03       4 阅读
  4. Python语言-面向对象

    2024-07-10 21:20:03       7 阅读

热门阅读

  1. 软设之桥接模式

    2024-07-10 21:20:03       12 阅读
  2. 洛谷 B4006 [GESP202406 四级] 宝箱

    2024-07-10 21:20:03       11 阅读
  3. Qt常用基础控件总结—菜单控件(QMenu类)

    2024-07-10 21:20:03       12 阅读
  4. 缓存击穿、缓存穿透、缓存雪崩以及应对措施

    2024-07-10 21:20:03       9 阅读
  5. Python基础学习笔记——异常

    2024-07-10 21:20:03       10 阅读
  6. C语言 printf函数缓冲机制

    2024-07-10 21:20:03       12 阅读