从Python源代码生成UML图的最佳方法是什么?

395 投票
9 回答
330954 浏览
提问于 2025-04-11 20:00

一位同事想从大量的Python源代码中生成UML类图。他主要关注的是类之间的继承关系,对组合关系也有一点兴趣,但对那些只是Python基本类型的类属性不太在意。

这些源代码相对简单,并没有什么特别复杂的地方,比如没有使用什么花哨的元类魔法。(大部分代码是来自Python 1.5.2时代,偶尔夹杂一些“现代”的2.3左右的内容。)

有什么好的现成解决方案可以推荐吗?

9 个回答

14

有些表现良好的程序可以用图表表示,但一般情况下是做不到的。因为在Python中,程序运行时可以扩展对象,而且任何类型的对象都可以被赋值给任何实例变量。要弄清楚一个对象可以包含哪些类(也就是组合),就需要完全理解程序在运行时的行为。

Python的 metaclass(元类)功能意味着,要理解继承结构,也需要对程序的运行时行为有全面的了解。

为了证明这些事情是不可能的,你可以这样推理:如果真的存在这样的UML图表生成器,那么你可以拿一个任意的程序,把“停止”语句转换成会影响UML图的语句,然后用这个图表生成器来解决“停机问题”,而我们都知道这是不可能的。

105

Epydoc 是一个工具,可以从 Python 源代码生成 API 文档。它还可以生成 UML 类图,使用 Graphviz 来实现一些炫酷的效果。这里有一个 示例图,是从 Epydoc 自身的源代码生成的。

因为 Epydoc 既能检查对象的属性,又能解析源代码,所以它能收集到比静态代码分析工具(比如 Doxygen)更多的信息:它可以检查很多动态生成的类和函数,还能利用注释或者未赋值的字符串作为文档来源,比如变量和类的公共属性。

245

你可能听说过 Pylint,它可以帮助我们静态检查Python代码。很少有人知道,它还带有一个叫做 Pyreverse 的工具,可以从读取的Python代码中绘制UML图。Pyreverse使用Graphviz作为后端工具。

使用方法如下:

pyreverse -o png -p yourpackage .

这里的 . 也可以是一个单独的文件。

撰写回答