我有一个模块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}}无效。
有没有办法在这个模块中使用内省来查找这个类的所有实例?我希望有一种方法可以避免制作一个列表并附加每个实例。
答案 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}中定义的工厂函数或者在其他模块中。
如果您实际上试图获取模块中创建的所有实例,则表明存在严重的编码问题;考虑在该模块中编写一个工厂函数包装器,除了传递初始化参数并返回结果,跟踪初始化对象之外什么都不做。