python基础(abc类)

2017-09-27  本文已影响0人  永远学习中

abc

ABC是Abstract Base Class的缩写。
Python本身不提供抽象类和接口机制,要想实现抽象类,可以借助abc模块。
abc类中常见的方法有:ABCMeta,abstractmethod,classmethod

abc.ABCMeta

这是用来生成抽象基础类的元类。由它生成的类可以被直接继承。

具体化抽象类的方法有两种:

通过注册(register)

通过继承

通过注册进行具体化抽象类

from abc import ABCMeta
#生成实现类
class Foo:
    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)

通过继承具体化抽象类

#构建抽象类
class PluginBase(metaclass= abc.ABCMeta):
    #__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
 #构建具体类,其继承了抽象类,实现了抽象类的方法       
class SubclassImplementation(PluginBase):
    
    def load(self, input):
        return input.read()
    
    def save(self, output, data):
        return output.write(data)
 #判断是否真的实现了继承
if __name__ == '__main__':
    print 'Subclass:', issubclass(SubclassImplementation, PluginBase)
    print 'Instance:', isinstance(SubclassImplementation(), PluginBase)
上一篇下一篇

猜你喜欢

热点阅读