乐趣区

关于python:深入类和对象抽象基类abc模块

Python 是动静语言,动静语言是没有变量类型的,在 Python 中变量只是一个符号而已,是能够指向任何类型的对象
不举荐应用形象基类

1. 查看某个类中是否存在某个办法

class Company(object):
    def __init__(self, employee_list):
        self.employee = employee_list
    def __len__(self):
        return len(self.employee)
com = Company(['123', '234'])
print(hasattr(com, '__len__'))  # True

以上为一般办法,以下为形象基类

2. 在某些状况下心愿判断某个对象的类型

from collections.abc import Sized
print(isinstance(com, Sized)) # True

collections.abc 中 Sized 源码

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

3. 强制某个子类必须实现某些办法

例如:
实现一个 Web 框架,继承 cache(redis, cache, memorycache)
须要设计一个形象基类,指定子类必须实现某些办法

首先实现一个基类

class CacheBase():
    def get(self, key):
        raise NotImplementedError
    def set(self, key, value):
        raise NotImplementedError
        
class RedisCache(CacheBase):
    pass
    
redis_cache = RedisCache()
redis_cache.set('key', 'value')
# 运行后果,会执行基类中的办法并抛出异样
class RedisCache(CacheBase):
    def set(self, key, value):
        pass
    
redis_cache = RedisCache()
redis_cache.set('key', 'value')
# 如果子类中实现了基类中的办法,则不会抛出异样

应用 abc 形象基类实现

import abc

class CacheBase(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def get(self, key):
        pass
    @abc.abstractmethod
    def set(self, key, value):
        pass
        
class RedisCache(CacheBase):
    pass
    
redis_cache = RedisCache()
# 应用 abc 形象基类实现,如果子类不实现基类中的办法,在实例化子类的时候会报错

class RedisCache(CacheBase):
    def get(self, key):
        pass
    def set(self, key, value):
        pass
# 应用 abc 形象基类实现,实现基类中的办法,在实例化子类的时候不会报错
退出移动版