Python进阶:理解元类创建类ABCMeta

一、理解元类(Meta class)

要想理解ABCMeta类,我们需要先理解元类。

1.1 元类直观理解

理解元类:
(1)元类的含义:Meta类就是元类——类的类,在Python中定义类的关键字class也是一个对象,那么实例化class对象的类就是元类。元类的目的就是为了控制类的创建行为。
(2)元类的生成:type作为Python的内建元类,是用来控制类的生成的,class对象就是type实例化生成的。
(3)Python中类的创建方法:因此,Python中创建类的方法其实有两种:(a)使用class关键字;(2)通过type关键字。具体创建过程可参考博客:深入理解Python元类(原创)

1.2 Python官方文档给出的元类描述

有了上面的直观理解,再来看看Python中文官网文档的第3节的数据类型:3.3.3.1元类中对元类的表述:

metaclass元类:一种用于创建类的类。类定义包含类名、类字典和基类列表。元类负责接受上述三个参数并创建相应的类。大部分面向对象的编程语言都提供一个默认实现。Python的特别之处在于可以创建自定义元类。大部分用户永远不需要这个工具,但当需要出现时,元类可提供求强而优雅的解决方案。它们已被用于记录属性访问日至、添加线程安全性、跟踪对象创建、实现单例,以及其他很多任务。

默认情况下,Python的类是使用type()来构建的。类体将在一个新的命令空间内执行,类名会被局部绑定到type(name, bases, namespace)的结果。

类创建过程可通过在定义行传入metaclass关键字参数,或通过继承一个包含此参数的现有类来进行定制。在以下示例中,MyClassMySubclass都是Meta的实例:

在这里插入图片描述

二、理解抽象基类(ABC, Abstract Base Classes)

2.1 Python官方文档给出的抽象基类概念

Python中文手册中的手册术语对照表中对抽象基类的表述如下:

abstract base class – 抽象基类:抽象基类简称ABC,是对duck-typing(鸭子类型)的补充,它提供了一种定义接口的新方式,相比之下其他及其例如hasattr()显得过于笨拙或有微妙错误(例如使用魔法方法)。ACB引入了虚拟子类,这种类并非继承子其他类,但却能被isinstance()issubclass()所认可。Python自带许多内置的ABC用于实现数据结构(在collections.abc模块中)、数字(在numbers模块中)、流(在io模块中)、导入查找其和加载器(在importlib.abc模块中)。

由于下面在查看ABCMeta源码中的注释及示例时,用到isinstance()issubclass()两个函数,这里解释以下它们的作用:

  • (1)isinstance(object, classinfo):如果object参数是classinfo参数的实例,或其(直接、间接或virtual)子类的实例,则返回True;否则返回False
  • (2)issubclass(class, classinfo):如果classclassinfo(或其直接、间接或virtual)的子类,则返回True;否则返回False

2.2 抽象基类abc模块源码注释理解

Python库包中的abc定义了抽象基类(ABC, Abstract Base Classes)的组件。abc模块提供了一个抽象基类元类(ABCMeta,用来定义抽象类。同时提供了一个工具类ABC,可以用它以继承的方式定义抽象基类。由下图的abc模块的组成结构图,可以看出ABCMeta类的数据类型为type类型,可以用来生成ABC类(其类型为ABCMeta类型)。

在这里插入图片描述
abc.ABC

abc.ABC是一个使用ABCMeta作为元类的工具类。抽象基类可以通过ABC派生来简单地创建:

在这里插入图片描述
注意,ABC的类型仍然是ABCMeta。简单来说,abc模块、ABCMeta类、ABC类关系如下图所示:

请添加图片描述

三、理解ABCMeta

3.1 理解ABCMeta

有了元类、抽象基类两个概念的感性认识,这个时候就容易理解ABCMeta了。

abc.ABCMeta是用来定义抽象基类ABC的元类。使用ABCMeta元类创建抽象基类,并可以像mix-in类一样直接被子类继承。同时,我们也可以将不相关的具体类(包括内建类)和抽象基类注册为“抽象子类”——这些类以及它们的子类会被内建函数 issubclass()识别为对应的抽象基类的子类,但是该抽象基类不会出现在其 MRO(Method Resolution
Order,方法解析顺序)中,抽象基类中实现的方法也不可调用(即使通过 super() 调用也不行)。

3.2 创建ABCMeta类的过程

使用ABCMeta元类创建的类可以使用register(subclass)方法,register(subclass)将“子类”注册为该抽象基类的“抽象子类”,比如下面的例子:

在这里插入图片描述

  • 10
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python进阶之路》是一本非常值得推荐的Python进阶书籍。这本书由一位经验丰富的Python大牛所著,作者拥有超过20年的Python开发经验。这本书涵盖了许多Python进阶知识点,如元编程、动态属性、属性描述符、异步处理等。书中详细列举了这些高级特性的使用方法,并讲解得非常透彻。如果你想从入门迈向进阶,这本书是必备的参考资料。 另外,《Python Cookbook》也是一本非常受欢迎的Python进阶书籍。这本书总结了大量精妙的编程技巧和实用的技术,无论你是Python新手还是老手,都会从中收获很多。豆瓣评分高达9.2分,可见其受到广大读者的认可。 除了以上两本书,《Python进阶技巧》也是一本非常值得一读的进阶书籍。这本书的作者将许多代码简化成了一行,展现了Python的高级技巧。虽然有些地方可能看起来有些夸张,但它确实帮助你了解Python的特性和一些不错的功能。而且,在关键时刻,这种技巧还可以让你轻松搞定其他人需要十几行代码才能完成的任务。对于想要进阶的同学来说,这本书的阅读是非常适合的。 总而言之,《Python进阶之路》、《Python Cookbook》和《Python进阶技巧》都是非常优秀的Python进阶书籍,适合想要深入学习Python的读者。 : 引用自《Python进阶之路》 : 引用自《Python Cookbook》 : 引用自《Python进阶技巧》

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值