abc是Abstract Base Classes的缩写
six的元类注解兼容python2和3

import abcimport six@six.add_metaclass(abc.ABCMeta)
class PluginBase(object):@abc.abstractmethoddef func_a(self, data):"""an abstract method need to be implemented.:param data: :return: """@abc.abstractmethoddef func_b(self, output, data):"""another abstract method need to be implemented.:param output: :param data: :return: """class RegisteredImplementation(object):def func_c(self, data):print "Method in third-party class, " + str(data)

PluginBase和RegisteredImplementation在语法上没有任何继承关系。
但PluginBase的元类是abc.ABCMeta
PluginBase本身是由ABCMeta创建出来的。ABCMeta作为元类,其方法的第一个参数是cls, 代表元类的实例,即指定元类为ABCMeta的类,也就是PluginBase

在ABCMeta中有个register方法:

def register(cls, subclass):"""Register a virtual subclass of an ABC."""# ...

PluginBase可以直接调用register,就像实例调用实例方法一样,点操作符前面是“接收者”: PluginBase.register(RegisteredImplementation)
等同于: abc.ABCMeta.register(PluginBase, RegisteredImplementation)

那么这个方法是干什么的?从源码可以看出,是将一个类注册为这个类的虚拟子类。
实验一下:

if __name__ == '__main__':# OOP=> PluginBase.register(RegisteredImplementation)abc.ABCMeta.register(PluginBase, RegisteredImplementation)for sc in PluginBase.__subclasses__():print "subclass of PluginBase: " + sc.__name__print "----------"print issubclass(RegisteredImplementation, PluginBase)print isinstance(RegisteredImplementation(), PluginBase)print "----------"obj1 = RegisteredImplementation()obj1.func_c("")# 报错,AttributeError: 'RegisteredImplementation' object has no attribute 'func_a'obj1.func_a("asdf")

首先将RegisteredImplementation注册为PluginBase的虚拟子类;
然后查看PluginBase的subclasses, 结果什么也没打出。说明虚拟子类不是真正的子类。
再查看issubclass和isinstance方法,均打印True. 说明虚拟子类影响这两个判断方法
最后尝试用RegisteredImplementation的实例调用自身和PluginBase的方法,结果调用自身的方法OK,调用PluginBase的抽象方法报错了。

虚拟子类就到这里。下面看下,如果一个类继承了PluginBase会怎样
PluginBase指定了元类,且声明了两个抽象方法。

class RealSubclass(PluginBase):def func_a(self, data):print "impl"def func_x(self):print "func_x"if __name__ == '__main__':# TypeError: Can't instantiate abstract class RealSubclass with abstract methods func_bx = RealSubclass()

由此可见,PluginBase利用six和abc的注解充当了Java中interface的角色
继承PluginBase的类必须全部实现其抽象方法,否则实例化会报错。

简单总结:

  1. 用法:
  • @six.add_metaclass(abc.ABCMeta)用于指定元类,兼容python2和3
  • @abc.abstractmethod用于声明抽象方法;
  • abc.ABCMeta.register方法用于将任意类注册为虚拟子类
  1. 通过标准方式继承抽象类的类,必须全部实现抽象类的抽象方法,否则不能实例化
  2. 虚拟子类不影响subclasses, 可以不实现抽象方法,只要不调用。

作者:俊杰的简书
链接:https://www.jianshu.com/p/d9cd26c06f4b
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

python之abc和six相关推荐

  1. python中abc属于字符串吗_在Python中,字符串s = 'abc',那么执行表达式s+'d'之后,s的打印结果是( )。...

    [单选题]当知道条件为真,想要程序无限执行直到人为停止的话,可以需要下列哪个选项? [单选题]Python3解释器执行 for i,v in enumerate([0,1,2],2):print(i, ...

  2. python从abc发展起来_Python是如何一步步成为热门编程语言的?

    Python的创始人是荷兰的Guido van Rossum(见下图). 1989年,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC 语言的一种继承.之所以选中Python作 ...

  3. Python的ABC模块

    1.abc模块作用 Python本身不提供抽象类和接口机制,要想实现抽象类,可以借助abc模块.ABC是Abstract Base Class的缩写. 2.模块中的类和函数 abc.ABCMeta 这 ...

  4. 学习Python的ABC模块

    http://yansu.org/2013/06/09/learn-python-abc-module.html 1.abc模块作用 Python本身不提供抽象类和接口机制,要想实现抽象类,可以借助a ...

  5. python中abc属于字符串吗_Python基础学习:字符串

    Python 版本: 3.6.2 操作系统: Windows 作者: SmallWZQ 在 Python 中,字符串也是一种数据类型.相比其它数据类型,字符串算是比较复杂的.为 何呢?因为字符串不仅包 ...

  6. Python实现ABC人工蜂群优化算法优化支持向量机回归模型(SVR算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 人工蜂群算法(Artificial Bee Colony, AB ...

  7. Python之abc模块

    abc:Abstract Base Classes 作用:在代码中定义和使用抽象基类进行API检查. 1. 为什么使用abc? Abstract base classes由一组接口组成,检查比hasa ...

  8. Python实现ABC人工蜂群优化算法优化支持向量机分类模型(SVC算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 人工蜂群算法(Artificial Bee Colony, AB ...

  9. Python高级:了解Python ABC(抽象基类)及 应用场景

    ABC,Abstract Base Class(抽象基类),主要定义了基本类和最基本的抽象方法,可以为子类定义共有的API,不需要具体实现.相当于是Java中的接口或者是抽象类. 抽象基类可以不实现具 ...

最新文章

  1. ubuntu笔记 - 安装和配置Sublime Text
  2. python将第一列替换_python-通过将另一列与第二个DataFrame进行比较来替换一列中的值...
  3. Jzoj5234 外星人的路径
  4. CO模块之利润中心会计
  5. java 序列化 clone_利用java序列化进行对象深Clone
  6. 社交网络营销之制订“参与社交网络的规则”
  7. secucrecrt配置文件导入和保存
  8. 安装指定版本的GPU版本的tensorflow小技巧
  9. javascript页面刷新与定时跳转页面
  10. python enumerate_详解 Python 的 enumerate 函数
  11. 初用WEB IOU,IE LAB备战启航
  12. java用1234组成_java编程题,java1234组成三位数不重复
  13. 【错误信息】Maximum call stack size exceeded
  14. 不小心删除的文件怎么找回,文件误删除恢复的方法
  15. 【unity记录】导入标准资源包(Standard Assets)
  16. 《平潭史话》之平潭轮渡
  17. rds的连接数_阿里云数据库RDS配置详解规格代码最大连接数IOPS
  18. Fragment跳转Fragment以及闭坑指南、方法isadded()
  19. 工业机器人和PLC是什么关系
  20. 由于无法验证发布者 所以windows阻止此软件

热门文章

  1. SAP S4 FI后台详细配置教程- PART4 (科目及税费相关配置篇)
  2. 新版微信页面底部导航问题
  3. python爬取支付宝基金数据_python爬取支付宝账单
  4. 我从《阿里云:人工智能应用实践与趋势》白皮书学到了什么?
  5. 使用IDEA插件反编译jar包文件
  6. 怎么扫描图片存为电子版?只需要几步小操作
  7. Java第n次入门之画板的实现
  8. 【软考-中级】系统集成项目管理工程师【总】
  9. saas php7框架开源,HRM SAAS v2.5.7 – PHP人力资源管理系统SaaS平台版
  10. Advanced COM Interop