查找注册类的所有抽象基类

max*_*max 6 python abstract-class subclass abc python-3.x

如何找到给定类是"虚拟子类"的所有抽象基类?

换句话说,我正在寻找一个virtual_base_classes()像这样的魔术函数:

>>> for cls in virtual_base_classes(list):
>>>   print(cls)
<class 'collections.abc.MutableSequence'>
<class 'collections.abc.Sequence'>
<class 'collections.abc.Sized'>
<class 'collections.abc.Iterable'>
<class 'collections.abc.Container'>
Run Code Online (Sandbox Code Playgroud)

(我不知道所有注册的abclist,所以上面的例子可能不完整.)

请注意,并非每个抽象基类都将被定义collections.abc.有一个模块abc(不同于collections.abc)提供了元类ABCMeta.任何类都是ABCMeta使用标准接口(register方法)支持"虚拟子类"注册的实例.没有什么可以阻止某人(程序员或Python库)创建一个ABCMeta不属于的实例collections.abc.

Ash*_*ary 5

使用issubclass和列表理解:

>>> import collections.abc
>>> import inspect
>>> [v for k, v in vars(collections.abc).items()
                                  if inspect.isclass(v) and issubclass(list, v) ]
[<class 'collections.abc.Container'>,
 <class 'collections.abc.Sequence'>,
 <class 'collections.abc.MutableSequence'>,
 <class 'collections.abc.Iterable'>,
 <class 'collections.abc.Sized'>
]
Run Code Online (Sandbox Code Playgroud)