我有一个模块foo
定义一个类Foo
,并实例化该类的多个实例。
从其他模块,我可以import foo
并获得一个列表Foo
实例化的对象:
[getattr(foo,f) for f in dir(f) if isinstance(getattr(foo,f), foo.Foo)]
如果我可以在模块内执行此操作会很方便foo
。但正如所写,名字foo
里面没有意义foo
,并更改为self
没有帮助。
有没有一种方法可以在该模块中使用内省来查找该类的所有实例?我希望有一种方法可以避免制作列表并附加每个实例。
goal: "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
或其他东西,但这会阻止您使用中定义的工厂函数foo.py
或者在其他模块中。
但是,如果您实际上试图获取模块中创建的某些内容的所有实例,则这是严重编码问题的迹象;考虑在该模块中编写一个工厂函数包装器,它除了传递初始化参数并返回结果、跟踪初始化对象之外什么都不做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)