最近学习进阶Python发现有些容易混淆的内容,例如本次标题中所写的全局abc模块,_collections_abc模块,collections包里面的abc模块,collections包。自己找了相关资料,发现一般都是单独分开写的,在此给放到一起对比一下,欢迎各位提建议
首先明白两个事情:
一:元类,用来创建类的类,父类为type或type本身
二:抽象基类,规定继承类必须具有抽象基类指定的方法,同时无法实例化,定义抽象基类为类名(metaclass=abc.ABCMeta),此时此类是抽象基类。
三:类定义时不指定metaclass默认用type创建,用metaclass=abc.ABCMeta创建的类是抽象基类
其次说明几个模块的内容和功能:
- 全局abc模块:抽象基类模块(Abstract Base Classes),模块中主要定义一个函数叫abstractmethod和一个元类ABCMeta(type),还有其他的内容不常用。ABCMeta父类是type所以是一个元类,自己定义抽象基类需要先导入这个模块,并将自定义类的metaclass指定为abc.ABCMeta
- _collections_abc模块:定义好的抽象基类集合(Abstract Base Classes for collections),例如"Iterable", “Iterator”, “Generator”, “Reversible”,当自己写的类要实现可迭代,那么可以继承Iterable抽象基类,一旦继承那么就必须实现__iter__这个魔法方法,强制性的约束。也可以不继承抽象基类,而是自己直接在类中写入这个魔法方法,那么也可以实现Iterable。
- collections包:有两个模块,一个是__init__.py,主要定义一些数据容器类,可以用来继承使用,尤其是Python内置的一些例如list,dict,string这些不适合直接继承,而应该继承这个里面的UserList,UserDict。另外一个是abc模块直接完全导入了_collections_abc模块中所有内容。由此可以发现这个包就是集成了已经设计好的抽象基类集合和可以集成的容器。
以上模块和包都需要先导入后使用,如有错误欢迎留言。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)