Python ABC(抽象基类)
轉自: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(抽象基类)相关推荐
- Python:抽象基类(abc模块)
抽象基类(abc模块) 介绍 白话理解 实用场景 介绍 该模块提供了一个元类 ABCMeta,可以用来定义抽象类,另外还提供一个工具类 ABC,可以用它以继承的方式定义抽象基类. 装饰器以" ...
- python之抽象基类
抽象基类特点 1.不能够实例化 2.在这个基础的类中设定一些抽象的方法,所有继承这个抽象基类的类必须覆盖这个抽象基类里面的方法 思考 既然python中有鸭子类型,为什么还要使用抽象基类? 一是我们在 ...
- python abc模块_3-2 抽象基类abc模块
abc ---- Abstract base class 何为抽象基类: 类比JAVA: 可以当作是JAVA中的接口,在JAVA里面它是无法实现多继承的,JAVA只能继承一个类,但是JAVA可以继承多 ...
- python 基类是什么_python之抽象基类
python之抽象基类 抽象基类,在这个类中定义一些方法,所有继承这个类的类必须实现这个方法,并且这个类不能被实例化, 使用抽象基类的情况: 1.某些情况下希望判断某个对象的类型 2.强制子类必须实现 ...
- Python高级:了解Python ABC(抽象基类)及 应用场景
ABC,Abstract Base Class(抽象基类),主要定义了基本类和最基本的抽象方法,可以为子类定义共有的API,不需要具体实现.相当于是Java中的接口或者是抽象类. 抽象基类可以不实现具 ...
- python抽象基类的作用_Python:多态、鸭子模型和抽象基类
1. 多态 什么是多态 -- 多态,指的是一种事务具有多种形态: -- python是一种动态语言,默认支持多态,同一个方法 调用 不同的类对象 ,执行的 结果各不相同: 多态实现 -- 继承:不同子 ...
- python虚函数_Python进阶话题杂谈(十三)纯虚函数与抽象基类
纯虚函数与抽象类都是Python面向对象中重要的编程范式,用于对继承类做强制性接口实现约定. abc模块包含了一系列与抽象基类与纯虚函数相关的方法.Python中通过修改元类进行抽象基类的设定.这里P ...
- python类方法和实例方法syntax errors_《Fluent Python》CH.11_面向对象_接口:从协议到抽象基类...
主要内容 首先,本章说明抽象基类的常见用途:实现接口时作为超类使用 说明抽象基类如何检查具体子类是否符合接口定义,以及如何使 用注册机制声明一个类实现了某个接口,而不进行子类化操作 最后, 说明如何让 ...
- Python学习笔记28:从协议到抽象基类
Python学习笔记28:从协议到抽象基类 今后本系列笔记的示例代码都将存放在Github项目:https://github.com/icexmoon/python-learning-notes 在P ...
最新文章
- pythonis啥意思-isinstance在python中的意思是什么?
- 八、【栈和队列】栈的应用
- python 多进程multiprocessing 队列queue报错:AttributeError: Can't pickle local object
- NIFI工作流备份和恢复
- 通过WordPress内置函数批量添加文章
- Python学习16 正则表达式3 练习题
- 【计算机网络复习 数据链路层】3.5.4 CSMA-CD协议
- 中国自主可控的全数字实时仿真软件SkyEye支持龙芯CPU指令级仿真
- 经验 | 计算机专业科班出身如何提高自己编程能力?
- 威纶通定时循环操作宏_威纶通触摸屏宏指令的使用
- c语言上机考试设计题及答案,C语言程序设计基础上机考试一题目及参考答案.doc...
- PLSQL_案例优化系列_明白索引是如何让SQL运行飞快(案例5)
- 常见的c语言头文件作用,C语言的头文件的作用是什么?
- [Hyper-V]使用操作系统模板创建新的虚拟机
- 震惊!人工智能已经发展到这个地步了
- MySql的完整卸载(总共四个步骤)
- 最全面、最详细web前端面试题及答案总结
- FileviewPro万能文件查看器
- 将yolo格式数据集转换为coco格式数据集
- 智能中线保护装置-零线电流保护器-中性线保护装置
热门文章
- 基于springboot实现注册功能发送激活码至邮箱激活账户登录
- 大商创是用哪种php柜架写的,大商创X二次开发基本规范与流程
- Zookeeper——Watcher原理详解
- 如何在阿里云购买物联网卡并激活
- 专题:预测大盘20190410
- Spring 框架更新了一条可能造成 RCE(远程命令执行漏洞)
- gitlab push 时提示 “Empty Reply From Server”
- UE4内存检测工具使用
- 比特率 Kbps kbit/s 1KB/s Byte 的正确理解
- [论文阅读] (20)USENIXSec21 DeepReflect:通过二进制重构发现恶意行为(恶意代码ROI分析经典)