获取python文件中的类列表

时间:2016-12-08 11:05:14

标签: python

我尝试使用python从python文件中获取类的列表。经过几次搜索后,我得到的代码我认为它的工作如下

def get_class_from_file(class_obj, file, path='app', exclude=[]):
    class_list = []
    module = importlib.import_module(path + '.' + file)
    for x in dir(module) :
        app_cls = getattr( importlib.import_module(path + '.' + file), x )
        try :
            if app_cls and issubclass(app_cls, class_obj) and app_cls != class_obj and app_cls not in exclude:
                class_list.append( (file, x) )
        except TypeError :
            pass
    return class_list

然而,我发现代码不只得到类的列表,但它仍然继续显示文件中类的超类,这里是示例

file_1.py

class A:
    pass

class B(A):
    pass

file_2.py

class C(B):
    pass

class D:
    pass

当我把这个函数称为 class_list = get_class_from_file(A,'file_2')

我希望结果是[C],但它返回[C,B],因为B是超级C之一

请帮我解决这个问题,我只想在给定文件中找到类,而不是任何超类。顺便说一句,我首先使用exclude来修复它,但它并没有给我一个长期的解决方案。

1 个答案:

答案 0 :(得分:2)

问题是还找到了导入的模块。你可以检查一个班级' __module__属性,以查看它是来自当前模块还是已导入其中。

您还有importlib.import_module(path + '.' + file)两次,我删除了其中一个。我将x重命名为name

def get_class_from_file(class_obj, file, path='app', exclude=[]):
    class_list = []
    module_path = path + '.' + file
    module = importlib.import_module(module_path)
    for name in dir(module) :
        app_cls = getattr(module, name)
        try:
            if (issubclass(app_cls, class_obj) and
                 app_cls != class_obj and
                 app_cls not in exclude and
                 app_cls.__module__ == module_path):
            class_list.append( (file, name) )
        except TypeError:
            # Not a class
            pass
    return class_list