首页 > 解决方案 > 有没有一种简单的方法可以以树的形式打印一个类的层次结构?

问题描述

是否有一个函数可以以树的形式打印 python 类的层次结构,就像git log --graphgit 提交一样?

我想做的例子:

class A(object): pass
class B(A): pass
class C(B): pass
class D(A): pass
class E(C, D): pass

printtree(E)

输出可能是什么样子的示例(但变化很好)。如果 mro 也可以直接从图表中读取,则可以加分,就像我在这里从上到下所做的那样,但如果不是这样也可以。

E
|\
C |
| D
B |
|/
A
|
object

标签: pythonmultiple-inheritancegraph-visualization

解决方案


不,没有内置函数可以做到这一点,你必须自己构建。但是要知道,布置和绘制 ASCII 图形是一项复杂的任务,Mercurial 图形代码(相当于 Python 的git log --graph相当复杂

将图形布局留给像Graphviz这样的专用实用程序会更有效率。有人已经编写了代码来执行此操作,请参阅Michele Simionato 博士的这篇文章,他们转向:

class M(type): pass # metaclass
class F(object): pass
class E(object): pass
class D(object): pass
class G(object): __metaclass__=M
class C(F,D,G): pass
class B(E,D): pass
class A(B,C): pass

进入

在此处输入图像描述

完成标签中列出的完整 MRO。虽然代码是 15 年前编写的,但它仍然可以按设计在 Python 3 上运行(我使用 3.8.0a1 进行了测试)。


推荐阅读