Python -- abc module

1.ABC模块做用

Python自己不提供抽象类和接口机制,想要实现抽象类,能够借助abc模块。ABC是Abstract Base Class的缩写,是用来定义抽象类的,具体的介绍请参考PEP 3119python

2.模块中的类和函数介绍

abc.ABCMeta,用来生成抽象基础类的元类。由它生成的类能够被直接继承。ssh

register首先注册一个abc的虚拟子类函数

from abc import ABCMeta 
     
    class MyABC: 
        __metaclass__ = ABCMeta 
     
    MyABC.register(tuple) 
     
    assert issubclass(tuple, MyABC) 
    assert isinstance((), MyABC)

上面这个例子中,首先生成了一个MyABC的抽象基础类,而后再将tuple变成它的虚拟子类。而后经过issubclass或者isinstance均可以判断出tuple是否是出于MyABC类。spa

检查子类是否被确认为ABC的子类。你也能够本身定制一个issubclass方法,这样就不须要再调用register()了。这个方法能够返回Ture,False或NotImplemented。若是返回的是TRUE,这个子类就被认为是ABC的子类了。若是返回FALSE,这个子类就不被认为是ABC的子类。若是是NotImplemented 请检查 子类的继承关系和语法。也能够经过复写__subclasshook__(subclass)来实现相同功能,它必须是classmethod。code

下面是一个实用的例子:继承

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)

abc.abstractmethod(function),代表抽象方法的生成器接口

class classname:
    __metaclass__ = ABCMeta

    @abstractmethod
    def __my_abstract_method__(self):
        ...

abc.abstractproperty([fget[,fset[,fdel[,doc]]]]),代表一个抽象属性get

class classname:
    __metaclass__ = ABCMeta

    @abstractproperty
    def my_abstract_property(self):
        ...

上例只是只读属性,若是是读写属性,能够以下:it

相关文章
相关标签/搜索