根据python代码自动生成类图的实现方法[附带python源码]

news2025/1/8 10:41:47

概述

利用python库抽象语法树(AST)和类图描述语言(PlantUML),实现自动将python代码生成类图的目的。

环境

windows+vscode+python+plantuml

✒️网上好像大部分都是用Pyreverse库来实现的,但是我实际测试发现只能在一个文件中才能行,当然应该有解决方法,由于我用plantuml居多,就想是不是能转换一下,所以这个方法就没多研究。此处也安利一把PlantUML,有兴趣的可以看下官网介绍,有比较详细的使用说明,
在这里插入图片描述
预览按钮在编辑界面的右上角在这里插入图片描述

使用说明

这个脚本只是简单的处理继承关系和多个文件的自动化访问,还有很多方面的不足例如没有属性区分、错误处理、性能等。

在使用此脚本时需要将directory_to_process = '../hb'中的’…/hb’`更改为您需要查看类关系的代码目录,然后执行脚本后会生成对应的plantuml格式的文件,然后点击生成的plantuml的文件后点击右上角的预览,会出现一个处理中的界面,稍等后就可以看到对应的图片了。
在这里插入图片描述

python脚本源码

import ast
import os

class ClassInfo:
    def __init__(self, name, methods=None, attributes=None, bases=None):
        self.name = name
        self.methods = methods if methods is not None else []
        self.attributes = attributes if attributes is not None else []
        self.bases = bases if bases is not None else []

def parse_python_file(file_path):
    with open(file_path, 'r',encoding='utf-8') as file:
        source_code = file.read()
    
    tree = ast.parse(source_code)# 使用ast模块提供的parse()函数将源代码解析为抽象语法树对象
    classes = {}
    
    for node in ast.walk(tree): #使用walk()方法遍历该抽象语法树对象
        if isinstance(node, ast.ClassDef):
            class_name = node.name

            methods = [n.name for n in ast.walk(node) if isinstance(n, ast.FunctionDef)]
            attributes = []  # Note: Attributes are not directly represented in AST, usually set in __init__
             # 提取基类列表
            bases = []
            for base in node.bases:
                if isinstance(base, ast.Name):
                    # 如果基类是一个简单的名称,则提取其id
                    bases.append(base.id)
                else:
                    # 如果基类不是简单的名称,则可以选择跳过它、记录警告或错误
                    # 例如,记录警告:
                    # print(f"Warning: Non-simple base class expression found in class {class_name}: {ast.dump(base)}")
                    pass
            
            classes[class_name] = ClassInfo(class_name, methods, attributes, bases)
    
    return classes

def generate_plantuml(classes):
    plantuml_code = "@startuml\n"
    
    for class_name, info in classes.items():
        plantuml_code += f"class {class_name} {{\n"
        for method in info.methods:
            plantuml_code += f"  +{method}()\n"
        # Add attributes if you can extract them (not shown here)
        plantuml_code += "}\n"
        
        for base in info.bases:
            plantuml_code += f"{class_name} --|> {base}\n"
    
    plantuml_code += "@enduml\n"
    
    return plantuml_code

def process_directory(directory):
    all_classes = {}
    
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith('.py'):
                file_path = os.path.join(root, file)
                classes = parse_python_file(file_path)
                all_classes.update(classes)
    
    return all_classes

# Example usage
directory_to_process = '../hb'
all_classes = process_directory(directory_to_process)
plantuml_desc = generate_plantuml(all_classes)

# Print or save the PlantUML description
print(plantuml_desc)
# You can save plantuml_desc to a .puml file and use PlantUML tools to convert it to an image.
with open('output.puml', 'w', encoding='utf-8') as file:
    file.write(plantuml_desc)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2273157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

下载b站高清视频

需要使用的edge上的一个扩展插件,所以选择使用edge浏览器。 1、在edge浏览器上下载 强力视频下载合并 扩展插件 2、在edge上打开b站,登录自己账号(登录后才能下载到高清!!)。打开一个视频,选择自…

flutter 专题二十四 Flutter性能优化在携程酒店的实践

Flutter性能优化在携程酒店的实践 一 、前言 携程酒店业务使用Flutter技术开发的时间快接近两年,这期间有列表页、详情页、相册页等页面使用了Flutter技术栈进行了跨平台整合,大大提高了研发效率。在开发过程中,也遇到了一些性能相关问题和…

UE5 打包要点

------------------------- 1、需要环境 win sdk ,大约3G VS,大约10G 不安装就无法打包,就是这么简单。 ----------------------- 2、打包设置 编译类型,开发、调试、发行 项目设置-地图和模式,默认地图 项目…

vulnhub靶场【DC系列】之5

前言 靶机:DC-5,IP地址为192.168.10.4 攻击:kali,IP地址为192.168.10.2 都采用VMWare,网卡为桥接模式 对于文章中涉及到的靶场以及工具,我放置网盘中https://pan.quark.cn/s/2fcf53ade985 主机发现 使用…

双模态视觉特征流用于医学报告生成|文献速递-视觉大模型医疗图像应用

Title 题目 Dual-modality visual feature flow for medical report generation 双模态视觉特征流用于医学报告生成 01 文献速递介绍 医学报告生成是一项新兴的跨模态文本生成任务(X. Zeng et al., 2020;Najdenkoska et al., 2022;Li et…

基于Fluent和深度学习算法驱动的流体力学计算与应用

物理模型与深度学习的融合:研究如何将传统的物理模型与深度学习算法相结合,以提高流体力学问题的预测准确性和计算效率。复杂流动模拟:利用深度学习技术对复杂流动现象进行模拟和分析,包括湍流、多相流、非牛顿流体等,…

记PasteSpider部署工具的Windows.IIS版本开发过程之草稿-动态表单(2)

接1的内容,那么有这么一个需求! 需求分析 需要修改某一个配置的时候 1.从对应的api中读取消息,消息内容为Json格式的 2.基于当前的Json渲染成表单提供给管理端的客户呈现 3.管理端的用户可以基于这个表单的内容进行修改,然后提交…

pycharm-pyspark 环境安装

1、环境准备:java、scala、pyspark、python-anaconda、pycharm vi ~/.bash_profile export SCALA_HOME/Users/xunyongsun/Documents/scala-2.13.0 export PATH P A T H : PATH: PATH:SCALA_HOME/bin export SPARK_HOME/Users/xunyongsun/Documents/spark-3.5.4-bin…

Clisoft SOS设置Workarea

Clisoft SOS设置Workarea 本人也是刚刚接触这个软件,可能有些方面不够完善,欢迎大佬指点。 这里就不演示创建创建Server和Project,可以参考Clisoft SOS设置Server和Project 创建Workarea 创建好目录并设置好权限 # 创建组 [bhlumaster ~]$…

数据结构:LinkedList与链表—无头双向链表(二)

目录 一、什么是LinkedList? 二、LinkedList的模拟实现 1、display()方法 2、addFirst(int data)方法 3、addLast(int data)方法 4、addIndex(int index,int data)方法 5、contains(int key)方法 6、remove(int key)方法 7、removeAllKey(int key)方法 8、…

基于SpringBoot实现的保障性住房管理系统

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…

【Linux】硬链接和软连接(符号连接)

目录 硬链接 软连接 硬链接和软连接的区别 硬链接 ln根据linux系统分配给文件inode(ls -li)进行建立,没办法跨越文件系统 格式:ln 被链接的文件(源文件) 生成的链接文件(目标文件) 1) 硬链接的属性 - 相当于生成一个副本 起别名 2) 修改内容都变化…

多目标优化算法——基于聚类的不规则Pareto前沿多目标优化自适应进化算法(CA-MOEA)

基于聚类的不规则Pareto前沿多目标优化自适应进化算法(CA-MOEA) 一、算法简介 简介: 现有的多目标进化算法(moea)在具有规则Pareto前沿且Pareto最优解在目标空间上连续分布的多目标优化问题(MOPs&#xff…

基于SpringBoot的乐器商城购物推荐系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

【vba源码】自动获取汇率

Hi,大家好! 没有想到今天居然是腊八,过了腊八就是年,离过年越来越近了,那在这里给大家就拜个年,希望大家在新的一年都有好事发生。 最近在弄点小项目,在项目遇到了一个汇率计算的问题&#xff…

JavaEE初阶——计算机工作原理

一、什么是JavaEE JavaEE(Java Platform,Enterprise Edition)是sun公司(2009年4月20日甲骨文将其收购)推出的企业级应用程序版本。这个版本以前称为 J2EE。能够帮助我们开发和部署可移植、健壮、可伸缩且安全的服务器…

【Unity3D】AB包加密(AssetBundle加密)

加密前: 加密后,直接无法加载ab,所以无法正常看到ab内容。 using UnityEngine; using UnityEditor; using System.IO; public static class AssetBundleDemoTest {[MenuItem("Tools/打包!")]public static void Build(){//注意:St…

数据库语句学习

WHERE AND: 请编写 SQL 语句,从 courses 表中,选取课程名为 Web 或者 Big Data 的课程信息,如果这两门课程存在,请将这两门课程的信息全部返回。 SELECT * FROM courses where name in (Web,Big Data) -- 等同于 -- WHERE name …

“AI智慧语言训练系统:让语言学习变得更简单有趣

大家好,我是你们的老朋友,一个热衷于探讨科技与教育结合的产品经理。今天,我想和大家聊聊一个让语言学习变得不再头疼的话题——AI智慧语言训练系统。这个系统可是我们语言学习者的福音,让我们一起来揭开它的神秘面纱吧&#xff0…

Postman接口测试05|实战项目笔记

目录 一、项目接口概况 二、单接口测试-登录接口:POST 1、正例 2、反例 ①姓名未注册 ②密码错误 ③姓名为空 ④多参 ⑤少参 ⑥无参 三、批量运行测试用例 四、生成测试报告 1、Postman界面生成 2、Newman命令行生成 五、token鉴权(“…