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