博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python模块文档学习之抽象基类abc模块
阅读量:6479 次
发布时间:2019-06-23

本文共 2103 字,大约阅读时间需要 7 分钟。

PEP里面关于抽象类的相关介绍:

python中并没有提供抽象类与抽象方法,但是提供了内置模块abc(abstract base class)来模拟实现抽象类。
主要类或函数:
abc.ABCMeta 这是用来生成抽象基础类的元类。由它生成的类可以被直接继承。
abc.ABC辅助类,让你可以不用关心元类概念,直接继承它,就有了ABCMeta元类。使用时注意元类冲突
@abc.abstractmethod 定义抽象方法,除了这个装饰器,其余装饰器都被deprecated了。

from abc import ABCMetaclass MyABC(metaclass=ABCMeta):    passMyABC.register(tuple)assert issubclass(tuple, MyABC)assert isinstance((), MyABC)

上面这个例子中,首先生成了一个MyABC的抽象基础类,然后再将tuple变成它的虚拟子类。然后通过issubclass或者isinstance都可以判断出tuple是不是出于MyABC类。

另外,也可以通过复写__subclasshook__(subclass)来改变issubclass或者isinstance的行为,__subclasshook__(subclass)必须定义为classmethod

class Foo:    def __getitem__(self, index):        ...    def __len__(self):        ...    def get_iterator(self):        return iter(self)class MyIterable(metaclass=ABCMeta):    @abstractmethod    def __iter__(self):        while False:            yield None    def get_iterator(self):        return self.__iter__()    @classmethod    def __subclasshook__(cls, C):        if cls is MyIterable:            if any("__iter__" in B.__dict__ for B in C.__mro__):                return True        return NotImplementedMyIterable.register(Foo)

通过@abc.abstractmethod将方法声明为抽象方法。

具体化抽象类可以有两种方式,一种通过注册(register),另外一种通过继承。
上面介绍的是注册方式,
注册方式的缺点:不会出现在类的MRO (Method Resolution Order),故而也不能通过super()来调用抽象方法。当没有实现抽象方法时,实例化时候不会报错,只有在调用时候才会报错。

下面介绍继承方式:

继承方式的优点:直接从抽象基类派生子类有一个好处,除非子类实现抽象基类的抽象方法,否则子类不能实例化。

继承方式:

import abcclass PluginBase(metaclass= abc.ABCMeta):    #__metaclass__ = abc.ABCMeta        @abc.abstractmethod    def load(self, input):        """Retrieve data from the input source and return an object."""        return        @abc.abstractmethod    def save(self, output, data):        """Save the data object to the output."""        return        class SubclassImplementation(PluginBase):        def load(self, input):        return input.read()        def save(self, output, data):        return output.write(data) if __name__ == '__main__':    print 'Subclass:', issubclass(SubclassImplementation, PluginBase)    print 'Instance:', isinstance(SubclassImplementation(), PluginBase)

collections中的抽象类

定义了几个抽象类。

具体请看。

参考:

转载地址:http://kpwuo.baihongyu.com/

你可能感兴趣的文章
在WPF应用程序中利用IEditableObject接口实现可撤销编辑的对象
查看>>
android 8 wifi wifi 扫描过程
查看>>
phalcon的save方法保存失败?
查看>>
获取任意链接文章正文 API 功能简介
查看>>
js中Math.random()生成指定范围数值的随机数
查看>>
线程类的常见方法介绍
查看>>
Spring连接数据库的几种常用的方式
查看>>
MS CRM 2011 Schedule Report & Email Subscription
查看>>
Linux2.6内核驱动移植参考
查看>>
eclipse打开当前文件所在文件夹
查看>>
去哪儿搜索引擎QSearch设计与实现
查看>>
POJ 2255 Tree Recovery (二叉树)
查看>>
HDU 1026 Ignatius and the Princess I
查看>>
There are two ways for Datatable download as excel
查看>>
TextBox客户端JS赋值 后台获取(转载)
查看>>
Yii2的深入学习--行为Behavior
查看>>
SQL Server 之 事务与隔离级别实例讲解
查看>>
PCA误差
查看>>
烦人的数据不一致问题到底怎么解决?——通过“共识”达成数据一致性
查看>>
WPFの获取任意元素的位置
查看>>