在 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]
我正在 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]