python 实现 抽象基类 abc模块

抽象基类(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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值