前言:
抽象基类与描述符和元类一样,是用于构建框架的工具。因此,只有少数Python开发者编写的抽象基类不会对用户施加不必要的限制,让他们做无用功。
目录:
- 内容回顾
- 相关资料
- 阅读后感
正文:
一. 内容回顾
1.1 Python文化中的接口和协议
协议是接口,但不是正式的(只由文档和约定定义),因此协议不能像正式接口那样施加限制。
1.2 Python喜欢序列
Python数据模型的哲学是尽量支持基本协议。
1.3 使用猴子补丁在运行时实现协议
1.4 Alex Martelli的水禽
1.5 定义抽象基类的子类
1.6 标准库中的抽象基类
大多数抽象基类在collections.abc模块中定义。
1.7 定义并使用一个抽象基类
1.8 Tombola子类的测试方法
_ subclass_()
这个方法返回类的直接子类列表,不含虚拟子类。
__adb__registry
只有抽象基类有这个属性,其值是一个WeakSet对象,即抽象类注册的虚拟子类的弱引用。
1.9 Python使用register的方法
Tombola.register当作类装饰器使用,在Python 3.3之前的版本中不能这样使用register,必须在定义类之后像普通函数那样调用。
1.10 鹅的行为有可能像鸭子
二. 相关资料
2.1 抽象基类
抽象类(abstract base class,ABC)就是类里定义了纯虚成员函数的类。纯虚函数[1] 只提供了接口,并没有具体实现。抽象类不能被实例化(不能创建对象),通常是作为基类供子类继承,子类中重写虚函数,实现具体的接口。简言之,ABC描述的是至少使用一个纯虚函数的接口,从ABC派生出的类将根据派生类的具体特征,使用常规虚函数来实现这种接口。【百度百科】
2.2 abc — 抽象基类
Python中并没有提供抽象类与抽象方法,但是提供了内置模块abc(abstract base class)来模拟实现抽象类。
主要类或函数:
1. abc.ABCMeta 这是用来生成抽象基础类的元类。由它生成的类可以被直接继承。
2. abc.ABC辅助类,让你可以不用关心元类概念,直接继承它,就有了ABCMeta元类。使用时注意元类冲突
3. @abc.abstractmethod 定义抽象方法,除了这个装饰器,其余装饰器都被deprecated了。
三. 阅读后感
在写JAVA基于APPIUM UI自动化框架中用到了abstract抽象基类的概念,在Python之前尚未在实际编码过程中使用过,在书中讲到了不建议自己编写抽象基类,除非自己对Python的一五一十都非常了解才去使用。该章节讲得过于理论化,翻阅了两遍都尚未明白,待以后对Python更加理解深入了,再回头看看这个抽象基类。
参考:
1. 流畅python学习笔记:第十一章:抽象基类
2. 抽象基类-百度百科
3. Python模块文档学习之抽象基类abc模块