抽象基类(ABCs),:
目的:
事先定义这个类能满足的需求。
概念:
定义一组必须被类的鸭子类型实例实现的方法和属性
抽象基类部分或全部方法和属性不用实现
特点:
所以如果不实现抽象了的的方法属性,对象无法实例化。
所有为抽象属性方法提供具体实现的类都是抽象基类的子类
分类:
内置的,大多数存在于colletions模块
https://www.cnblogs.com/dianel/p/10787693.html
自定义的抽象基类
https://blog.csdn.net/qq_35371031/article/details/91385811
https://www.cnblogs.com/FG123/p/9463673.html
例:`内置
from collections import Container
Container.__abstractmethods__
#查看它的抽象方法
frozenset({'__contains__'})
#说明Container只是实现了__containes__一个抽象方法
help(Container.__contains__)
#用help方法查看函数的签名
Help on function __contains__ in module collections.abc:
__contains__(self, x)
#只需要一个参数,给用户检查它的值是否在这个容器中。
元组,字典,序列都实现了这个方法。
from collections import Container
class OddContainer:
"判断一个数是否为偶数"
def __contains__(self, x):
if not isinstance(x.int) or not x%2:
return False
return True
odd=OddContainer()
print(isinstance(odd,Container))
#判断两个类型是否相同,并且考虑继承关系,认为子类是一种父类类型
print(issubclass(OddContainer,Container))
#判断参数 OddContainer 是否是类型参数 Container 的子类
True
True
鸭子类型的多态相比传统的多态,我们不用使用继承关系,就可以创建“是一个”关系。
如上一个例子,我们只是OddContainer类实现了一个抽象方法就创建了“是一个关系”
所有为抽象属性方法提供具体实现的类都是抽象基类的子类
所有为抽象属性方法提供具体实现的类都是抽象基类的子类
常见的面向对象语言通常在类的接口和实现之间有明确的区分,如JAVA的interface关键字,用于当以不需要事先的方法。在这这种环境中,抽象类提供了一个接口,以及众多方法钟某几个的具体实现,任何类可以明确声明实现自某国接口
python的ABC帮助提供了接口的功能。