Python进阶第一讲之抽象基类的理解

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中的接口,那我们下次见!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值