当我打电话给setup_all()
时,我正在徘徊elixir \ sqlalchemy如何了解我在模型中声明的所有实体类?我在我的一个小项目中需要这种功能,但我不知道。我试图通过elixir的setup_all()
进行操作,我发现它将所有实体类的集合保存在一个“全局”列表中(或者它是dict?),但我无法捕捉到列表已填写。有什么想法吗?
答案 0 :(得分:9)
对于类定义,这更容易(无导入)
def find_subclasses(cls):
results = []
for sc in cls.__subclasses__():
results.append(sc)
return results
我不确定你是想要这个还是对象。如果你想要对象:
import gc
def find_subclasses(cls):
results = []
for sc in cls.__subclasses__():
for obj in gc.get_objects():
if isinstance(obj, sc):
results.append(obj)
return results
答案 1 :(得分:4)
回答主要问题,根本没有与SQLALchemy或elixir签订协议 - 是的,可以在Python中使用。
标准库上的垃圾收集器(gc
)模块具有一个函数调用,允许人们检索对给定对象的所有引用,解释器范围。在任何继承类的__mro__
属性中始终引用类。
因此,以下函数可以检索从给定类继承的所有类:
import gc
def find_subclasses(cls):
all_refs = gc.get_referrers(cls)
results = []
for obj in all_refs:
# __mro__ attributes are tuples
# and if a tuple is found here, the given class is one of its members
if (isinstance(obj, tuple) and
# check if the found tuple is the __mro__ attribute of a class
getattr(obj[0], "__mro__", None) is obj):
results.append(obj[0])
return results