轉自:https://blog.csdn.net/qijiqiguai/article/details/77269839

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

Python 对于ABC的支持模块是abc模块,定义了一个特殊的metaclass:ABCMeta 还有一些装饰器:@abstractmethod 和 @abstarctproperty 。abc.ABCMeta 用于在Python程序中创建抽象基类,而抽象基类如果想要声明“抽象方法”,可以使用 @abstractmethod ,如果想声明“抽象属性”,可以使用 @abstractproperty

为了解决Python2&3的兼容问题,需要引入six模块,该模块中有一个针对类的装饰器 @six.add_metaclass(MetaClass) 可以为两个版本的Python类方便地添加metaclass

通用做法:以裝飾器手法修飾類別

@six.add_metaclass(MetaClass) 的作用是在不同版本的Python之间提供一个优雅的声明类的metaclass的手段,事实上不用它也可以,只是使用了它代码更为整洁

import six

import abc

@six.add_metaclass(abc.ABCMeta)

class MyClass(object):

pass

在Python 3 等价于

import six

import abc

class MyClass(object, metaclass = ABCMeta):

pass

在Python 2.x (x >= 6)中等价于

import abc

class MyClass(object):

__metaclass__ = ABCMeta

pass

不建議採用此法:在類別中以方法作定義

或者直接调用装饰器,这里也能看出来装饰器就是个方法包装而已

import six

import abc

class MyClass(object):

pass

MyClass  = six.add_metaclass(ABCMeta)(MyClass)

示例:

import abc

import six

@six.add_metaclass(abc.ABCMeta)

class BaseClass(object):

@abc.abstractmethod

def func_a(self, data):

"""

an abstract method need to be implemented

"""

@abc.abstractmethod

def func_b(self, data):

"""

another abstract method need to be implemented

"""

class SubclassImpl(BaseClass):

def func_a(self, data):

print("Overriding func_a, " + str(data))

@staticmethod

def func_c(self, data):

print(type(self) + str(data))

class RegisteredImpl(object):

@staticmethod

def func_d(data):

print("Method in third-party class, " + str(data))

BaseClass.register(RegisteredImpl)   #讓BaseClass具有RegisteredImpl功能,此也是其下子類別

if __name__ == '__main__':

for subclass in BaseClass.__subclasses__():   #由內定__subclasses__()方法查看含有那些子類別

print("subclass of BaseClass: " + subclass.__name__)  #只會顯示繼承体系下之子類別,register()方式不會顯示

print("subclass do not contains RegisteredImpl")

print("-----------------------------------------------")

print("RegisteredImpl is subclass: " + str(issubclass(RegisteredImpl, BaseClass)))

print("RegisteredImpl object  is instance: " + str(isinstance(RegisteredImpl(), BaseClass)))

print("SubclassImpl is subclass: " + str(issubclass(SubclassImpl, BaseClass)))

print("-----------------------------------------------")

obj1 = RegisteredImpl()

obj1.func_d("RegisteredImpl new object OK!")

print("-----------------------------------------------")

obj2 = SubclassImpl()  #由于没有实例化所有的方法,所以这里会报错 Can't instantiate abstract class SubclassImpl with abstract methods func_b

obj2.func_a("It's right!")

结果如下:

subclass of BaseClass: SubclassImpl

subclass do not contains RegisteredImpl

-----------------------------------------------

RegisteredImpl is subclass: True

RegisteredImpl object  is instance: True

SubclassImpl is subclass: True

-----------------------------------------------

Method in third-party class, RegisteredImpl new object OK!

-----------------------------------------------

Traceback (most recent call last):

File "/Users/wangqi/Git/Python/scrapy_crawler_learn/test/ABCTest.py", line 51, in <module>

obj2 = SubclassImpl()  #由于没有实例化所有的方法,所以这里会报错 Can't instantiate abstract class SubclassImpl with abstract methods func_b

TypeError: Can't instantiate abstract class SubclassImpl with abstract methods func_b

補充:參考 https://blog.csdn.net/ChangerJJLee/article/details/82355872

Python中没有提供抽象类与抽象方法,而是提供了内置abc模块来模拟实现抽象类,如提供泛映射类型的抽象类 abc.MutableMapping

  • 继承abc.MutableMapping來构造一个泛映射类型(*此类似Python中的dict)

# -*- coding: utf-8 -*-

from collections import abc

class MyDic(abc.MutableMapping):

def __init__(self):

pass

def __setitem__(self, key, value):

print ('key: %s  val: %s' % (key, value))

def __delitem__(self, key):

print ('key: %s ' % key)

def __getitem__(self, item):

print ('item: %s ' % str(item))

def __iter__(self):

pass

def __len__(self):

pass

当然直接继承abc.Mapping 也可以,毕竟MutableMapping是其子类,如下圖:

  • dict是Python中典型的数据结构,其接口的定义形式也来自abc.Mapping和abc.MutableMapping这俩种抽象类,可如下查驗:

# -*- coding: utf-8 -*-

from collections import abc

if __name__ == '__main__':

mydic = dict()

print( issubclass(dict, abc.MutableMapping))

print( issubclass(dict, abc.Mapping))

print( isinstance(mydic, abc.MutableMapping))

print( isinstance(mydic, abc.Mapping))

运行结果

True

True

True

True

关于abc的通用模块

---------------------

作者:AngelovLee

来源:CSDN

原文:

版权声明:本文为博主原创文章,转载请附上博文链接!

Python ABC(抽象基类)相关推荐

  1. Python:抽象基类(abc模块)

    抽象基类(abc模块) 介绍 白话理解 实用场景 介绍 该模块提供了一个元类 ABCMeta,可以用来定义抽象类,另外还提供一个工具类 ABC,可以用它以继承的方式定义抽象基类. 装饰器以" ...

  2. python之抽象基类

    抽象基类特点 1.不能够实例化 2.在这个基础的类中设定一些抽象的方法,所有继承这个抽象基类的类必须覆盖这个抽象基类里面的方法 思考 既然python中有鸭子类型,为什么还要使用抽象基类? 一是我们在 ...

  3. python abc模块_3-2 抽象基类abc模块

    abc ---- Abstract base class 何为抽象基类: 类比JAVA: 可以当作是JAVA中的接口,在JAVA里面它是无法实现多继承的,JAVA只能继承一个类,但是JAVA可以继承多 ...

  4. python 基类是什么_python之抽象基类

    python之抽象基类 抽象基类,在这个类中定义一些方法,所有继承这个类的类必须实现这个方法,并且这个类不能被实例化, 使用抽象基类的情况: 1.某些情况下希望判断某个对象的类型 2.强制子类必须实现 ...

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

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

  6. python抽象基类的作用_Python:多态、鸭子模型和抽象基类

    1. 多态 什么是多态 -- 多态,指的是一种事务具有多种形态: -- python是一种动态语言,默认支持多态,同一个方法 调用 不同的类对象 ,执行的 结果各不相同: 多态实现 -- 继承:不同子 ...

  7. python虚函数_Python进阶话题杂谈(十三)纯虚函数与抽象基类

    纯虚函数与抽象类都是Python面向对象中重要的编程范式,用于对继承类做强制性接口实现约定. abc模块包含了一系列与抽象基类与纯虚函数相关的方法.Python中通过修改元类进行抽象基类的设定.这里P ...

  8. python类方法和实例方法syntax errors_《Fluent Python》CH.11_面向对象_接口:从协议到抽象基类...

    主要内容 首先,本章说明抽象基类的常见用途:实现接口时作为超类使用 说明抽象基类如何检查具体子类是否符合接口定义,以及如何使 用注册机制声明一个类实现了某个接口,而不进行子类化操作 最后, 说明如何让 ...

  9. Python学习笔记28:从协议到抽象基类

    Python学习笔记28:从协议到抽象基类 今后本系列笔记的示例代码都将存放在Github项目:https://github.com/icexmoon/python-learning-notes 在P ...

最新文章

  1. pythonis啥意思-isinstance在python中的意思是什么?
  2. 八、【栈和队列】栈的应用
  3. python 多进程multiprocessing 队列queue报错:AttributeError: Can't pickle local object
  4. NIFI工作流备份和恢复
  5. 通过WordPress内置函数批量添加文章
  6. Python学习16 正则表达式3 练习题
  7. 【计算机网络复习 数据链路层】3.5.4 CSMA-CD协议
  8. 中国自主可控的全数字实时仿真软件SkyEye支持龙芯CPU指令级仿真
  9. 经验 | 计算机专业科班出身如何提高自己编程能力?
  10. 威纶通定时循环操作宏_威纶通触摸屏宏指令的使用
  11. c语言上机考试设计题及答案,C语言程序设计基础上机考试一题目及参考答案.doc...
  12. PLSQL_案例优化系列_明白索引是如何让SQL运行飞快(案例5)
  13. 常见的c语言头文件作用,C语言的头文件的作用是什么?
  14. [Hyper-V]使用操作系统模板创建新的虚拟机
  15. 震惊!人工智能已经发展到这个地步了
  16. MySql的完整卸载(总共四个步骤)
  17. 最全面、最详细web前端面试题及答案总结
  18. FileviewPro万能文件查看器
  19. 将yolo格式数据集转换为coco格式数据集
  20. 智能中线保护装置-零线电流保护器-中性线保护装置

热门文章

  1. 基于springboot实现注册功能发送激活码至邮箱激活账户登录
  2. 大商创是用哪种php柜架写的,大商创X二次开发基本规范与流程
  3. Zookeeper——Watcher原理详解
  4. 如何在阿里云购买物联网卡并激活
  5. 专题:预测大盘20190410
  6. Spring 框架更新了一条可能造成 RCE(远程命令执行漏洞)
  7. gitlab push 时提示 “Empty Reply From Server”
  8. UE4内存检测工具使用
  9. 比特率 Kbps kbit/s 1KB/s Byte 的正确理解
  10. [论文阅读] (20)USENIXSec21 DeepReflect:通过二进制重构发现恶意行为(恶意代码ROI分析经典)