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

  • 一、理解元类(Meta class)
    • 1.1 元类直观理解
    • 1.2 Python官方文档给出的元类描述
  • 二、理解抽象基类(ABC, Abstract Base Classes)
    • 2.1 Python官方文档给出的抽象基类概念
    • 2.2 抽象基类abc模块源码注释理解
  • 三、理解ABCMeta
    • 3.1 理解ABCMeta
    • 3.2 创建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)将“子类”注册为该抽象基类的“抽象子类”,比如下面的例子:

Python进阶:理解元类创建类ABCMeta相关推荐

  1. python进阶《面向对象编程》类和对象

    目录 零.前言 一.面向对象编程 (一)概念理解 二.类和对象的概念 (一)面向对象的两个重要概念类和对象. (二)类的解释   1.创建类   2.类属性(区别于下面的对象属性) (三)对象的解释 ...

  2. Python 进阶_OOP 面向对象编程_类属性和方法

    目录 目录 类属性 调用类属性 查看类属性 特殊的类属性 类方法 真构造器 __new__ 类属性 在理解类属性之前要先搞清楚 实例属性 和 函数属性 之间的区别: 1. 实例属性:指的是实例化类对象 ...

  3. Python 进阶_OOP 面向对象编程_类和继承

    目录 目录 类 最简单的类 类方法 构造器 __init__ 创建一个类 实例化一个对象 调用实例的方法和属性 创建子类 使用 super 来调用父类的构造器 实例化子类对象 调用子类的属性和方法 类 ...

  4. python 动态_python实现动态创建类的方法分析

    本文实例讲述了python实现动态创建类的方法.分享给大家供大家参考,具体如下: python作为动态语言,如何在运行时动态创建类呢(python Creating classes dynamical ...

  5. Python面向对象编程中的创建类及其实例化对象等方法.....【超级详细】

  6. [转]深刻理解Python中的元类(metaclass)

    类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Pytho ...

  7. 深刻理解Python中的元类(metaclass)以及元类实现单例模式

    在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例模式的那一节有些疑惑.因此花了几天时间研究下元类这个概念.通过学习元类,我对pyt ...

  8. 深度理解python中的元类

    本文转自:(英文版)https://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python   (翻译版)   http:// ...

  9. python 元类 type_Python 使用元类type创建类对象常见应用详解

    本文实例讲述了Python 使用元类type创建类对象.分享给大家供大家参考,具体如下: type("123") 可以查看变量的类型;同时 type("类名", ...

最新文章

  1. c#加粗代码_c#窗体,选中复选框,文字加粗变绿代码
  2. 计算机教学辅助在教学中的应用研究,云计算辅助教学在高职计算机教学中的应用研究.doc...
  3. Android 通过高德地图获取地址的经纬度
  4. linux 定时器_定时器: Nodejs 中的 timers
  5. 检测技术再进化:人物交互检测,基于多层次条件网络的方法(ICMR2020)
  6. IntelliJ IDEA连接mysql
  7. 专门为某种用途而设计的计算机 称为,专门为某种用途而设计的计算机,称为计算机...
  8. 6. Browser 对象 - Screen 对象(2)
  9. Windows Server 2008 R2 小技巧
  10. 卧槽,入职 3 天就“偷”代码,备份 6300 个 Python 脚本,不讲武德啊
  11. BMP测试图片及显示源码
  12. hack tool Mirkov4
  13. 彻底解决mac os 下javac Java命令行工具乱码问题
  14. 找个问道自动架设工具
  15. 敏捷开发?敏捷管理?什么是敏捷?(一)
  16. RPA 软件技术是什么意思
  17. C++程序设计:原理与实践读书笔记(第十二章)
  18. BigDecimal 金额转换
  19. Apache中间件漏洞深析
  20. 折腾笔记--Linux和Windows10双系统安装的一般步骤(通用)(物理机安装)

热门文章

  1. chromium Mojo (译)
  2. 微信公众号 授权登录 JAVA
  3. Idea 常用快捷键 (spring boot)
  4. 安卓TV插件化9.0内联崩溃原因及解决方案
  5. 微信语音输入不仅仅是懒癌患者的福音
  6. 芬兰16岁女孩担任“一日总理”
  7. java学习day50(RabbitMQ)RabbitMQ
  8. 来看看这份超全面的《Android面试题及解析》,知乎上已获万赞
  9. ecstore 挂件修改图片无效果的解决
  10. windows 下composer的安装