美文网首页
python基础(abc类)

python基础(abc类)

作者: 永远学习中 | 来源:发表于2017-09-27 00:19 被阅读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)
    

    相关文章

      网友评论

          本文标题:python基础(abc类)

          本文链接:https://www.haomeiwen.com/subject/pzfeextx.html