4

我在徘徊,当我打电话时,elixir\sqlalchemy 如何了解我在模型中声明的所有实体类setup_all()?我在我的一个小项目中需要这种功能,但我不知道。我试图通过 elixir's 逐步跟踪setup_all(),我发现它在“全局”列表中保留了所有实体类的集合(或者它是 dict?),但我无法捕捉到列表被填满的时刻。有任何想法吗?

4

2 回答 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 回答