1.什么是抽象基类
抽象基类(abstract base class,ABC)就是类里定义了纯虚函数的类。类似于Java中的接口,不能被实例化,只能被继承,任何继承自抽象基类的类,必须实现抽象基类中定义的抽象方法,否则该类无法被实例化。
2.Python中抽象基类的作用
2.1 检查某类中是否包含某种方法
# 1.定义Demo类,类中含有__len__魔法方法
class Demo(object):
def __init__(self,li):
self.li = li
def __len__(self):
return len(self.li)
# 2.导入抽象基类中的Sized类
from collections.abc import Sized
# 判断d 是否是 Sized 这个类
print(isinstance(d,Sized)) # True 说明d 是Sized 类型
# 结果为True,说明Demo类包含len魔法方法
在这里我们可以查看Sized类的源码,进一步确认
# python安装路径下Lib中的隐藏⽂件 _collections_abc.py
class Sized(metaclass=ABCMeta):
__slots__ = ()
@abstractmethod
def __len__(self):
return 0
@classmethod
def __subclasshook__(cls, C):
if cls is Sized:
return _check_methods(C, "__len__")
return NotImplemented
2.2 强制子类必须实现父类的方法
方法1:主动抛出异常
"""
强制子类重写
方法1 主动抛出异常
"""
class CacheBase(object):
def dele(self):
raise NotImplementedError
def crea(self):
raise NotImplementedError
class RedisBase(CacheBase):
'''
1.子类如果不重写父类方法访问时直接抛出异常
'''
pass
r = RedisBase() #实例化时并不会抛出异常,当调用未重写的方法时,才会抛出异常
r.crea() # raise NotImplementedError
r.dele() # raise NotImplementedError
方法2:抽象基类实现
import abc
# 注意:不是直接继承object 而是继承abc.ABCMeta
class CacheBase(metaclass=abc.ABCMeta):
@abc.abstractmethod
def dele(self):
pass
def crea(self):
pass
class RedisBase(CacheBase):
def dele(self):
pass
r = RedisBase()# 实例化时就会检测RedisBase类中是否实现了dele方法,如果未实现,则会报错
3.总结
抽象基类的功能已经通过代码呈现出来了,可以看到抽象基类确实类似Java中的接口,那我们下次见!