我在python中创建了一个插件管理器。我的计划是将所有可能的插件(可能由类,函数和类实例组成)附加到单个列表中,然后使用自定义过滤器函数来获取适当的对象。
如何从列表中获取所有类实例?类实例可以是任何类。
示例:
class A:
pass
def func():
pass
instance_a = A()
plugins = [func, A, instance_a]
现在假设我没有对类实例instance_a
的引用,我如何仅从plugins
中获取A
?它甚至可能吗?
答案 0 :(得分:3)
如果您想要所有不是类定义而不是函数的实例,那么您可以通过以下方式实现此目的:
import types
[x for x in plugins if type(x) == types.InstanceType]
但是,我认为这真的是一个容易出错的解决方案,因为你真的只能找到任何以某种方式扩展object
并且没有特殊类型的东西,就像函数一样。最好为通过类实例实现的所有插件定义一个超类,并对其进行过滤:
[x for x in plugins if isinstance(x, Plugin)]
答案 1 :(得分:0)
我能想到的最容易实现的方法是,如果有人遇到类似的问题,那就是:
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]