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
则无济于事.
有没有办法在这个模块中使用内省来查找这个类的所有实例?我希望有一种方法可以避免列出并附加每个实例.
目标:"
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并返回结果,跟踪初始化对象之外什么都不做.