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

Eri*_*son 3 python module introspection

我有一个foo定义类的模块Foo,并实例化该类的许多实例.

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

[getattr(foo,f) for f in dir(f) if isinstance(getattr(foo,f), foo.Foo)]
Run Code Online (Sandbox Code Playgroud)

如果我能从模块中做到这一点会很方便foo.但正如所写的那样,这个名字foo在内部毫无意义foo,而改变self则无济于事.

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

nin*_*cko 8

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

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

class Registered(object):
    _all = set()
    def __init__(self):
        self.__class__._all.add(self)
Run Code Online (Sandbox Code Playgroud)

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

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

>>> Registered._all
{<__main__.Registered object at 0xcd3210>, <__main__.Registered object at 0xcd3150>, <__main__.Registered object at 0xcd31d0>}
Run Code Online (Sandbox Code Playgroud)

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

如果这不是您真正想要的,您可以修改上述内容以跟踪对象在via inspect.currentframe().f_back.f_globals或其他模块中定义的模块,但这会阻止您使用foo.py在其他模块中定义的工厂函数.

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

  • 我建议对集合中的对象使用弱引用.否则很难收集它们. (3认同)