python 实现 抽象基类 abc模块

    技术2025-03-28  23

    抽象基类(abc模块) 抽象基类介绍 抽象基类(abstract base class,ABC):抽象基类就是类里定义了纯虚成员函数的类。纯虚函数只提供了接口,并没有具体实现。抽象基类不能被实例化(不能创建对象),通常是作为基类供子类继承,子类中重写虚函数,实现具体的接口。 抽象基类就是定义各种方法而不做具体实现的类,任何继承自抽象基类的类必须实现这些方法,否则无法实例化。 起名字时不要把模块名起为abc.py,因为abc基类的原因,那时候就会冲突 应用场景: 1.我们去检查某个类中是否有某种方法 2.我们需要强调某个子类必须实现某些方法

    1.检查某个类中是否有某种方法:以len为例子一种方式是通过反射实现的: class Demo(object): def __init__(self,li): self.li = li def __len__(self): return len(self.li) l = ['a','n','c'] d = Demo(l) print(len(d)) #触发return len(self.li) 返回了3 print(d.li) #如何判断一个类中是否有某个属性? print(hasattr(d,'__len__'))

    第二种方式是通过抽象基类实现的:

    class Demo(object): def __init__(self,li): self.li = li def __len__(self): return len(self.li) l = ['a','n','c'] d = Demo(l) print(len(d)) #触发return len(self.li) 返回了3 print(d.li) from _collections_abc import Sized print(isinstance(d,Sized)) #可以通过判断d是Sized的子类进而判断d是否含有len方法 #_collections_abc.py中搜Sized # @classmethod # def __subclasshook__(cls, C): # if cls is Sized: # return _check_methods(C, "__len__") # return NotImplemented

    可以通过判断d是Sized的子类进而判断d是否含有len方法 因为在这个定义中Sized的子类都含有len方法,是Sized的子类就含有len方法 _collections_abc位置: /python路径/Lib/_collections_abc.py 不过该文件为隐藏文件,需要看时要设置查看隐藏文件

    2.我们需要强调某个子类必须实现某些方法 如果没有重写某个方法的话就会抛出异常 实现的方式: 第一种方式:在父类定义,设置主动抛出异常 第二种方式:在父类中通过继承抽象基类实现抛异常

    第一种方式代码:

    ''' 强制子类必须实现父类的方法 • 定义父类Cache • 封装CRUD方法。强制子类重写该方法。 子类如果不重写该方法,就会报错 • 定义子类Redis 方式1:利用抛异常的方式 ''' class Cache(object): def dele(self): pass #raise NotImplementedError def crea(self): raise NotImplementedError class Redis(Cache): def crea(self): pass r = Redis() r.crea() r.dele()

    这种实现方式有其固有的缺点:只有当调用该方法时才会抛出异常,在实例化的时候 并不会有提示

    第2种方式: 通过继承抽象基类的方式:

    #此时只要新建实例,如果没有重写就会报错,而第一种的抛异常只有我们访问这个方法时才抛出异常,如果不访问就不会有影响 #抽象基类的方式 在实例化时如果发现没有重写就会抛出异常 import abc class Cache(metaclass=abc.ABCMeta): #直接继承抽象基类 #装饰器 @abc.abstractmethod def dele(self): pass #raise NotImplementedError def crea(self): pass #raise NotImplementedError class Redis(Cache): def crea(self): print('lcy') def dele(self): print('dele') r = Redis()
    Processed: 0.010, SQL: 12