如何实现Python程序读取目录源文件并生成类继承依赖列表?
Python类继承依赖分析实现方案
核心依赖模块
Python标准库内置的ast(抽象语法树)模块,无需额外安装第三方依赖,可静态解析源码结构,提取类定义与继承关系,不会触发目标代码的运行,完全适配你的需求。
实现逻辑
- 全局维护两个存储结构:
- 类定义映射:记录每个扫描到的类对应的源文件
- 继承关系映射:记录每个父类对应的所有子类列表
- 遍历目标目录,仅筛选后缀为
.py的源文件处理 - 对每个源文件用
ast.parse解析为语法树,遍历提取所有类定义节点,记录类信息与继承关系 - 所有文件扫描完成后按要求格式化输出结果
完整可运行代码
import sys import os import ast # 全局存储:类名 -> 所在文件名 class_defs = dict() # 全局存储:父类名 -> 子类名列表 inheritance_map = dict() def parse_py_file(file_path, file_name): try: with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 解析为抽象语法树 tree = ast.parse(content, filename=file_path) except Exception as e: print(f"跳过文件{file_path}:解析失败,{str(e)}") return # 遍历语法树所有节点,查找类定义 for node in ast.walk(tree): if isinstance(node, ast.ClassDef): class_name = node.name # 记录类所在文件 class_defs[class_name] = file_name # 遍历父类 for base in node.bases: # 处理直接写父类名的情况,如需处理带模块前缀的父类可扩展此处逻辑 if isinstance(base, ast.Name): base_class = base.id if base_class not in inheritance_map: inheritance_map[base_class] = [] inheritance_map[base_class].append(class_name) def process_files(path): if not os.path.isdir(path): print("输入路径不是有效目录") return try: for entry in os.listdir(path): entry_path = os.path.join(path, entry) if os.path.isfile(entry_path) and entry.endswith('.py'): parse_py_file(entry_path, entry) # 如需递归遍历子目录,可取消下方注释 # elif os.path.isdir(entry_path): # process_files(entry_path) except Exception as e: print(f"读取目录出错:{str(e)}") def output_result(): for base_class, sub_classes in inheritance_map.items(): # 仅输出当前扫描目录内定义的父类,如需包含内置父类可去掉该判断 if base_class not in class_defs: continue print(f"Class {base_class} [{class_defs[base_class]}]") for sub_class in sub_classes: print(f" Derived {sub_class} [{class_defs.get(sub_class, '外部定义')}]") def main(): if len(sys.argv) < 2: print("调用方式错误:python cs2.py 目标目录路径") return target_path = sys.argv[1] process_files(target_path) output_result() if __name__ == "__main__": main()
使用说明
和你要求的调用方式完全一致:python cs2.py "C:\Users\PC-server\Documents\PythonCode\dir1"
扩展说明
当前代码仅处理了父类直接写类名的简单场景,如需支持继承带模块前缀的类、递归扫描子目录、包含内置父类输出等能力,可根据注释对应调整逻辑。
内容的提问来源于stack exchange,提问作者Anuj Divkar
相关产品推荐
相关产品推荐

