python - Python pyreverse 可以为函数生成 UML 图吗?
问题描述
pyreverse是一个从 Python 代码生成 UML 图的好工具。但是,我发现它无法识别函数中使用的所有类。我举以下例子来说明我的观点:
class ClassA(object):
def __init__(self):
pass
class ClassB(object):
def __init__(self):
pass
class ClassC(object):
def __init__(self):
self.object_b = ClassB()
def perform():
object_a = ClassA()
如果我们使用 pyreverse 生成类图,很明显我们可以ClassB
看到ClassC
. 但是,它不能生成与ClassA
在其函数中使用的关系perform
。pyreverse 有什么方法可以检索 和 之间的ClassC
关系ClassA
?
解决方案
原因是:它是函数的局部变量而不是实例变量。object_a
因此,C 与 A 的关系不是结构性的。因此,它不是 UML 关联(也不是聚合,也不是组合)。
充其量,我们可以说存在从 C 到 A 的使用依赖关系。但这种用法是特定于实现的,不一定是设计的意思。
我不是 Python 专家,但如果 pyreverse 能够发现与 的正确关系object_b
,并且如果你在赋值中创建object_a
一个实例变量 with self.object_a
,你可以希望得到你期望的结果。
编辑:实验验证
如果按照说明更正了 C 类:
class ClassC(object):
def __init__(self):
self.object_b = ClassB()
def perform(self):
self.object_a = ClassA()
pyreverse 确实产生了预期的正确结果:
对于人类读者来说,很容易错过一个属性。这就是 pylint 对此代码发出警告的原因:
W0201: Attribute 'object_a' defined outside __init__ (attribute-defined-outside-init)
另请注意,如果您定义(静态)类变量而不是实例变量,pyreverse 不会使用带下划线的名称显示它。原因可能是,因为隐藏具有同名实例变量的类变量并不少见。
推荐阅读
- windows - 控制台应用程序中的 DOSCommand (TurboPack)
- java - 方法引发了“java.lang.IllegalArgumentException”异常。如何使用 java 反射设置私有最终值
- javascript - Multer 无法读取未定义的属性“文件名”
- php - 用 Twig 中的数组值替换字符串
- latex - 为什么我会收到“\
有一个额外的 }" 错误 - android - Android Kotlin Room Repository 无法从详细活动中检索行
- python - ValueError:分类指标无法处理未知目标和二进制目标的混合:0 和 1 预测
- javascript - 只记录到第一个数组
- c++ - windows shell扩展覆盖无法显示
- javascript - 从交互式 highchart.js 图中抓取数据