我尝试使用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来修复它,但它并没有给我一个长期的解决方案。
答案 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