python中并没有提供抽象类与抽象方法,但是提供了内置模块abc(abstract base class)来模拟实现抽象类。

 ABC,Abstract Base Class(抽象基类),主要定义了基本类和最基本的抽象方法,可以为子类定义共有的API,不需要具体实现。相当于是Java中的接口或者是抽象类。
 
Python 对于ABC的支持模块是abc模块,定义了一个特殊的metaclass:ABCMeta 还有一些装饰器:@abstractmethod 和 @abstarctproperty 。
abc.ABCMeta 用于在Python程序中创建抽象基类。如果抽象基类如果想要声明“抽象方法”,可以使用 @abstractmethod;如果想声明“抽象属性”,可以使用 @abstractproperty 。
 
抽象基类

 

抽象基类可以不实现具体的方法(当然也可以实现,只不过子类如果想调用抽象基类中定义的方法需要使用super())而是将其留给派生类实现。抽象基类提供了逻辑和实现解耦的能力,即在不同的模块中通过抽象基类来调用,可以用最精简的方式展示出代码之间的逻辑关系,让模块之间的依赖清晰简单。同时,一个抽象类可以有多个实现,让系统的运转更加灵活。而针对抽象类的编程,让每个人可以关注当前抽象类,只关注其方法和描述,而不需要考虑过多的其他逻辑,这对协同开发有很大意义。极简版的抽象类实现,也让代码可读性更高。
 
抽象基类的使用:
    1:直接继承
        直接继承抽象基类的子类就没有这么灵活,抽象基类中可以声明”抽象方法“和“抽象属性”,只有完全覆写(实现)了抽象基类中的“抽象”内容后,才能被实例化,而虚拟子类则不受此影响。
    2:虚拟子类
    将其他的类”注册“到抽象基类下当虚拟子类(调用register方法),虚拟子类的好处是你实现的第三方子类不需要直接继承自基类,可以实现抽象基类中的部分API接口,也可以根本不实现,但是issubclass(), issubinstance()进行判断时仍然返回真值。
 

抽象基本类的几大特点:

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)
View Code

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/

posted on 2019-04-17 15:34  小虾米与大鱼  阅读(624)  评论(0编辑  收藏  举报