python - 有没有一种简单的方法可以以树的形式打印一个类的层次结构?
问题描述
是否有一个函数可以以树的形式打印 python 类的层次结构,就像git log --graph
git 提交一样?
我想做的例子:
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
解决方案
不,没有内置函数可以做到这一点,你必须自己构建。但是要知道,布置和绘制 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 进行了测试)。
推荐阅读
- angular - 如何使用 TypeScript 读取 Angular EventEmitter 表单数据?
- ios - 如何将 GIGYA SWIFT SDK 集成到 react-native 项目中?
- mule - 如何在 MUnit 中使用“Mock When”模拟“MuleSoft Anypoint Exchange”自定义 API 连接器?
- charts - Google 表格中的记分卡
- ruby-on-rails - 使用 cancancan gem 创建动态角色
- c++ - 如何修复尝试支持 64 位时找不到 libcocos2dcpp.so
- amazon-web-services - api 请求如何触发 AWS lambda?
- javascript - 在从外部 url 加载的 iframe 页面中加载和播放包含在 cordova 应用程序中的本地视频文件
- r - 在 dplyr 中使用 bind_cols 映射数据
- spring-boot - 在 Spring Webflux Annotated 控制器中的不同线程中运行任务