Python -- abc module

发布时间:2019-09-18 07:24:51编辑:auto阅读(1612)

    今天,我们要讲的是python的ABC 模块

    这个模块是用来定义一个抽象类。具体的概要介绍可以浏览PEP 3119

    register

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

    1. from abc import ABCMeta 
    2.  
    3. class MyABC: 
    4.     __metaclass__ = ABCMeta 
    5.  
    6. MyABC.register(tuple) 
    7.  
    8. assert issubclass(tuple, MyABC) 
    9. assert isinstance((), MyABC) 

    在虚拟基类中,你也可以忽略这个方法。

    __subclasshook__ (subclass)

    这个方法必须定义

    检查子类是否被确认为ABC的子类。你也可以自己定制一个issubclass方法,这样就不需要再调用register()了。这个方法可以返回Ture,False或NotImplemented。如果返回的是TRUE,这个子类就被认为是ABC的子类了。如果返回FALSE,这个子类就不被认为是ABC的子类。如果是NotImplemented 请检查 子类的继承关系和语法。

    下面是一个实用的例子:

     

    1. class Foo(object): 
    2.     def __getitem__(self, index): 
    3.         ... 
    4.     def __len__(self): 
    5.         ... 
    6.     def get_iterator(self): 
    7.         return iter(self
    8.  
    9. class MyIterable: 
    10.     __metaclass__ = ABCMeta 
    11.  
    12.     @abstractmethod 
    13.     def __iter__(self): 
    14.         while False
    15.             yield None 
    16.  
    17.     def get_iterator(self): 
    18.         return self.__iter__() 
    19.  
    20.     @classmethod 
    21.     def __subclasshook__(cls, C): 
    22.         if cls is MyIterable: 
    23.             if any("__iter__" in B.__dict__ for B in C.__mro__): 
    24.                 return True 
    25.         return NotImplemented 
    26.  
    27. MyIterable.register(Foo) 

     

关键字