在 python 中筛选 类 的实例

Filter for instances of classes in python

我正在 python 中制作一个插件管理器。我的计划是将所有可能的插件(可能包括 classes、函数和 classes 的实例)附加到一个列表中,然后使用自定义过滤器函数来获取适当的对象.

如何从列表中取出所有 class 个实例? class 实例可以是任何 class.

示例:

class A:
    pass

def func():
    pass

instance_a = A()

plugins = [func, A, instance_a]

现在,假设我没有对 class 实例 A 的引用,我如何从 plugins 中仅获取 instance_a?有可能吗?

如果您想要所有不是 class 定义本身且不是函数的实例,那么您可以通过以下方式实现:

import types
[x for x in plugins if type(x) == types.InstanceType]

但是,我认为这确实是一个容易出错的解决方案,因为实际上您只是发现任何以某种方式扩展 object 并且没有特殊类型的东西,就像函数那样。最好为通过 class 实例实现的所有插件定义一个 superclass 并对其进行过滤:

[x for x in plugins if isinstance(x, Plugin)]

如果有人遇到类似问题,我能想到的最简单的方法是:

class A:
    pass

def func():
    pass

 a = A()
 plugins = [a, A, func]

 instance_plugins = [x for x in plugins if inspect.isclass(type(x)) and not type(x) == type]