python中并没有提供抽象类与抽象方法,但是提供了内置模块abc(abstract base class)来模拟实现抽象类。
抽象基本类的几大特点:
1. 要定义但是并不完整的实现所有方法
2. 基本的意思是作为父类
3. 父类需要明确表示出那些方法的特征,这样在写子类时更加简单明白
用抽象基本类的地方:
1. 用作父类
2. 用作检验实例类型
3. 用作抛出异常说明
abc模块中的类和函数
1. abc.ABCMeta: 用来生成抽象基础类的元类。由它生成的类可以被直接继承。
from abc import ABCMeta class MyABC: #1. 首先生成了一个MyABC的抽象基础类 __metaclass__ = ABCMeta # 使用了__metaclass__这个魔法方法就意味着就会用__metaclass__指定的元类来创建类了。 MyABC.register(tuple) #2. 然后再将tuple变成它的虚拟子类 assert issubclass(tuple, MyABC) assert isinstance((), MyABC) #3. 再通过issubclass或isinstance都可以判断出tuple是不是出于MyABC类。
也可以通过复写__subclasshook__(subclass)
来实现相同功能,它必须是classmethod
class Foo(object): def __getitem__(self, index): ... def __len__(self): ... def get_iterator(self): return iter(self) class MyIterable: __metaclass__ = ABCMeta @abstractmethod def __iter__(self): while False: yield None def get_iterator(self): return self.__iter__() @classmethod def __subclasshook__(cls, C): if cls is MyIterable: if any("__iter__" in B.__dict__ for B in C.__mro__): return True return NotImplemented MyIterable.register(Foo)
2. abc.abstractmethod(function): 表明抽象方法的生成器
class C: __metaclass__ = ABCMeta @abstractmethod def my_abstract_method(self, ...): ...
3. abc.abstractproperty([fget[,fset[,fdel[,doc]]]]): 表明一个抽象属性
class C: __metaclass__ = ABCMeta @abstractproperty def my_abstract_property(self): ...
上例只是只读属性,如果是读写属性,可以如下:
class C: __metaclass__ = ABCMeta def getx(self): ... def setx(self, value): ... x = abstractproperty(getx, setx)
定义抽象类
import abc class PluginBase(object): #定义一个抽象基类PluginBase,这个基类用于保存和加载数据。 __metaclass__ = abc.ABCMeta @abc.abstractmethod def load(self, input): """Retrieve data from the input source and return an object.""" return @abc.abstractmethod def save(self, output, data): """Save the data object to the output.""" return
【参考文档】
学习Python的ABC模块:https://blog.csdn.net/igorzhang/article/details/39026885
python abc模块 :https://www.cnblogs.com/wancy86/p/6269553.html?utm_source=itdadao&utm_medium=referral
python抽象基类abc:https://www.jianshu.com/p/19ed49293168
python面对对象编程---------6:抽象基类:https://www.cnblogs.com/pengsixiong/p/5382768.html
Python高级主题:Python ABC(抽象基类):https://blog.csdn.net/qijiqiguai/article/details/77269839
Python之Metaclass详解,Python之元类:https://www.cnblogs.com/intimacy/p/8119449.html
Python “黑魔法” 之 Meta Classes:http://python.jobbole.com/85126/