获取给定Python类实现的所有抽象基类的列表

获取给定Python类实现的所有抽象基类的列表,python,python-3.x,Python,Python 3.x,给定一个类(在Python 3.8中),如何获得它实现的所有抽象基类的列表?例如,给定列表,我正在寻找返回容器,可伸缩,集合,大小,序列,等等的内容 inspect.getmro()、和将提供父类,但不包括抽象基类。因此,对于list,它们只提供对象(对于mro对象,list本身) isinstance将告诉您一个对象是否实现了一个特定的抽象基类,而不是它实现的所有抽象基类的列表。您可以使用collections.abc。根据python文档 该模块提供抽象基类,可用于测试类是否提供特定接口;例

给定一个类(在Python 3.8中),如何获得它实现的所有抽象基类的列表?例如,给定
列表
,我正在寻找返回
容器
可伸缩
集合
大小
序列
,等等的内容

inspect.getmro()
将提供父类,但不包括抽象基类。因此,对于
list
,它们只提供
对象
(对于mro对象,
list
本身)


isinstance
将告诉您一个对象是否实现了一个特定的抽象基类,而不是它实现的所有抽象基类的列表。

您可以使用
collections.abc
。根据python文档

该模块提供抽象基类,可用于测试类是否提供特定接口;例如,它是可散列的还是映射的

链接-


这是不可能的,因为Python处理抽象基类中duck类型的方式。abc可以使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。例如,从:

class MyIterable(ABC):
# 
@类方法
定义子类钩子类(cls,C):
如果cls是MyIterable:
如果有,B中的(“\uuuu iter\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
返回真值
返回未执行
此代码表示类
C
MyIterable
的子类,如果它包含方法
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。如果您有一个任意类
X
,其中包含
\uuuu iter\uuuu
,它是
MyIterable
的一个子类,即使
X
从未明确扩展,甚至意识到
MyIterable
的存在。因此,发现给定类是否是一组抽象类的子类的唯一方法是使用
issubclass
检查每个抽象类

假设您要检查的“抽象基类子集”是所有抽象基类的集合,并且由于世界上可能有无限多个任意抽象基类,因此不可能对它们进行全部测试


当然,这是Python,它没有真正私有的东西。通过递归扫描
sys.modules
,并使用
issubclass
对所有类进行测试,从技术上讲,可以看到当前导入到代码中的所有类,但我无法想象这在任何实际程序中都是可行的。

这个答案确实满足了我所问的情况(获取collections.abc接口)。我希望有一种通用的方法来获取一个类实现的所有接口的列表,即使我不知道所有可能的接口是什么-比如System.Reflection在.NET中提供了什么。
In [22]: import collections.abc

In [23]: import inspect

In [31]: [(k,v) for k, v in vars(collections.abc).items() if inspect.isclass(v) and issubclass(list, v) ]
Out[31]:
[('Iterable', collections.abc.Iterable),
 ('Reversible', collections.abc.Reversible),
 ('Sized', collections.abc.Sized),
 ('Container', collections.abc.Container),
 ('Collection', collections.abc.Collection),
 ('Sequence', collections.abc.Sequence),
 ('MutableSequence', collections.abc.MutableSequence)]