我在徘徊,当我打电话时,elixir\sqlalchemy 如何了解我在模型中声明的所有实体类setup_all()
?我在我的一个小项目中需要这种功能,但我不知道。我试图通过 elixir's 逐步跟踪setup_all()
,我发现它在“全局”列表中保留了所有实体类的集合(或者它是 dict?),但我无法捕捉到列表被填满的时刻。有任何想法吗?
问问题
716 次
2 回答
10
对于类定义,这更容易(不导入)
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
于 2012-01-22T16:13:27.843 回答
4
回答主要问题,完全不与 SQLALchemy 或长生不老药脱节 - 是的,在 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
于 2012-01-21T22:04:06.833 回答