口时,想要让它未来既可以使用普通的cache,也可以使用redis缓存。那么只需要定义一个抽象的类Cache,里面实现两个抽象方法get()和set(),以后无论使用普通的cache还是redis缓存,都只需让这两种缓存类型实现且必须实现get()和set()即可。
import abc
class Cache(metaclass=abc.ABCMeta):
@abc.abstractmethod
def get(self, key):
pass
@abc.abstractmethod
def get(self, key, value):
pass
# 子类继承时,必须实现这两个方法
class CacheBase(Cache):
def get(self, key):
pass
def set(self, key, value):
pass
class Redis(Cache):
def get(self, key):
pass
def set(self, key, value):
pass
如果子类没有实现或者少实现了抽象类中的方法,在构造子类实例化对象的时候就会立即报错。
在Python中大多数时候不建议直接定义抽象类,这可能会造成过度封装/过度抽象的问题。如果想要让子类必须实现父类的某个方法,可以在父类方法中加上raise来抛出异常NotImplementedError,这时如果子类对象没有实现该方法,就会查找到父类的这个方法,从而抛出异常。
class Cache():
def get(self, key):
raise NotImplementedError("must define get method")
def set(self, key):
raise NotImplementedError("must define set method")
使用raise NotImplementedError的方式来模拟抽象类,它只有在调用到set/get的时候才会抛异常,在实例化对象的时候或者没有调用到这两个方法的时候不会报错。