Python如何自动检测基类的所有继承子类并批量完成实例调用
自动检测基类所有子类并批量执行的实现方案
核心实现原理
Python所有类都内置了__subclasses__()方法,会返回该类所有直接继承的子类列表,不需要额外做登记维护,完全满足需求。
基础版实现(仅识别直接子类)
直接替换原有主函数中的手动实例化调用部分即可:
if __name__ == "__main__": data = getData() # 自动遍历所有直接继承BaseProcessing的子类 for processor_cls in BaseProcessing.__subclasses__(): # 实例化并执行调用逻辑 processor = processor_cls(data) processor()
进阶版实现(支持识别多层继承的所有后代子类)
如果存在子类再被继承的多层继承场景,可以用递归函数遍历所有后代子类,同时支持跳过未实现核心逻辑的抽象中间类:
def get_all_descendant_subclasses(base_cls): subclass_list = [] for direct_subcls in base_cls.__subclasses__(): subclass_list.append(direct_subcls) # 递归查找子类的子类 subclass_list.extend(get_all_descendant_subclasses(direct_subcls)) return subclass_list if __name__ == "__main__": data = getData() all_processor_cls = get_all_descendant_subclasses(BaseProcessing) for processor_cls in all_processor_cls: # 可选判断:跳过没有重写do_algorithm的抽象子类,避免运行时报错 if processor_cls.do_algorithm is BaseProcessing.do_algorithm: continue processor = processor_cls(data) processor()
注意事项
- 所有自定义子类必须先被导入到当前运行环境,未被导入的类不会被Python加载,也就不会出现在子类列表中。如果子类分散在不同的py文件中,可以提前手动导入对应模块,或者用
importlib批量导入指定目录下的模块。 - 如果有部分子类不需要被自动执行,可以给子类添加标记属性过滤:
# 给不需要自动执行的子类加标记 class TestOnlyAlgorithm(BaseProcessing): _exclude_from_auto_run = True def do_algorithm(self): print("仅用于测试,不参与批量执行") # 遍历时增加过滤逻辑 for processor_cls in all_processor_cls: if getattr(processor_cls, '_exclude_from_auto_run', False): continue processor = processor_cls(data) processor()
内容的提问来源于stack exchange,提问作者kayos
相关产品推荐
相关产品推荐

