如何遍历每个类声明,来自特定的基类?

时间:2012-01-21 21:38:45

标签: python sqlalchemy python-elixir

当我打电话给setup_all()时,我正在徘徊elixir \ sqlalchemy如何了解我在模型中声明的所有实体类?我在我的一个小项目中需要这种功能,但我不知道。我试图通过elixir的setup_all()进行操作,我发现它将所有实体类的集合保存在一个“全局”列表中(或者它是dict?),但我无法捕捉到列表已填写。有什么想法吗?

2 个答案:

答案 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