有没有一种简单的方法可以树形形式打印类的层次结构?

时间:2019-03-01 12:44:23

标签: python multiple-inheritance graph-visualization

是否有一个函数可以像树git log --graph那样用git commits打印树状的python类的继承关系?

我想做的事的例子:

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

1 个答案:

答案 0 :(得分:5)

不,没有内置函数可以执行此操作,您必须构建自己的函数。但要知道布置和绘制ASCII图是一项复杂的任务,Mercurial绘图代码(Python等效于git log --graph)是quite involved and complicated

将图形布局留给Graphviz之类的专用实用程序会更有效率。有人已经编写了实现此目的的代码,请参见this article by Michele Simionato, Ph. D,他们会转向:

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

进入

enter image description here

完成并带有标签中概述的完整MRO。虽然该代码是15年前编写的,但它仍然可以按设计在Python 3上正常工作(我在3.8.0a1上进行了测试)。