如何在当前模块中获取类的所有实例

时间:2011-07-04 02:15:48

标签: python module introspection

我有一个模块foo,它定义了一个类Foo,并实例化了这个类的许多实例。

从其他模块,我可以import foo获取实例化的Foo对象列表:

[getattr(foo,f) for f in dir(f) if isinstance(getattr(foo,f), foo.Foo)]

如果我可以在模块foo内完成此操作,那将会很方便。但正如所写,foo内的名称foo无意义,而self更改为{{1}}无效。

有没有办法在这个模块中使用内省来查找这个类的所有实例?我希望有一种方法可以避免制作一个列表并附加每个实例。

1 个答案:

答案 0 :(得分:8)

  

目标:“ import foo并获取由...实例化的Foo对象列表

你根本不需要内省。想象一下这是你的班级:

class Registered(object):
    _all = set()
    def __init__(self):
        self.__class__._all.add(self)

演示;实例化一堆对象并引用它们:

>>> Registered()
>>> Registered()
>>> Registered()

>>> Registered._all
{<__main__.Registered object at 0xcd3210>, <__main__.Registered object at 0xcd3150>, <__main__.Registered object at 0xcd31d0>}

由于您正在使用dir,如果我理解正确,您正在尝试查找当前模块的全局变量中的所有对象。但是它并没有真正获得当前模块中的所有对象,只有那些绑定到变量的对象。如果那是你真正想要的,你可以{var for name,var in globals() if isinstance(var,Foo)}

如果那不是您真正想要的,您可以修改上述内容以通过inspect.currentframe().f_back.f_globals或其他方式跟踪对象所定义的模块,但这会阻止您使用{{1}中定义的工厂函数或者在其他模块中。

如果您实际上试图获取模块中创建的所有实例,则表明存在严重的编码问题;考虑在该模块中编写一个工厂函数包装器,除了传递初始化参数并返回结果,跟踪初始化对象之外什么都不做。