You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:06:08