4.2 抽象基类(abc模块)

抽象基类

  • 抽象基类无法实例化
  • 变量没有类型限制,可以指向任何类型
  • 抽象基类和魔法函数构成了python的基础,即协议

在抽象基类定义了抽象方法,继承了抽象基类的类,必须实现这些方法

场景一:想判断某个对象的类型

# 检查某个类是否有某种方法
class Company:
    def __init__(self, name):
        self.name = name

    def __len__(self):
        return len(self.name)


company = Company('Linda Process Ltd.')
print(hasattr(company, '__len__'))

from collections.abc import Sized
print(isinstance(company, Sized))

场景二:强制子类必须实现某些方法

import abc

class CacheBase(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def get(self, key):
        pass

    @abc.abstractmethod
    def set(self, key, value):
        pass


class MemoryCache(CacheBase):
    pass

注意:抽象基类容易设计过度,多继承推荐使用Mixin