Python Pyreverse 可以生成函数的 UML 图吗?

fee*_*ree 3 python uml class-diagram pylint pyreverse

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()
Run Code Online (Sandbox Code Playgroud)

如果我们使用pyreverse生成类图,很明显我们可以看到ClassB是 中的一个组件ClassCClassA但是,它无法生成其函数 中使用的与 的关系perform。Pyreverse 有什么办法可以检索ClassC和之间的关系ClassA吗?

Chr*_*phe 5

原因是的范围object_a:它是函数的局部变量,而不是实例变量。因此,C 与 A 的关系不是结构性的。因此,它不是UML 关联(也不是聚合,也不是组合)。

\n

充其量,我们可以说存在从 C 到 A 的用法依赖性。但这种用法是特定于实现的,并不一定是设计所意味着的。

\n

我\xe2\x80\x99m 不是Python专家,但是如果pyreverse能够发现 与 的正确关系object_b,并且如果你\xe2\x80\x99d在赋值中创建object_a一个实例变量,你可以希望得到这样的结果self.object_a你期望的。

\n

编辑:实验验证

\n

如果 C 类按照解释进行更正:

\n
class ClassC(object):\n    def __init__(self):\n        self.object_b = ClassB()\n    def perform(self):\n        self.object_a = ClassA()\n
Run Code Online (Sandbox Code Playgroud)\n

Pyreverse 确实产生了预期的正确结果:

\n

在此输入图像描述

\n

对于人类读者来说,很容易错过某个属性。这就是 pylint 对此代码发出警告的原因:

\n
W0201: Attribute \'object_a\' defined outside __init__ (attribute-defined-outside-init)\n
Run Code Online (Sandbox Code Playgroud)\n

另请注意,如果您定义(静态)类变量而不是实例变量,pyreverse 不会使用带下划线的名称显示它。原因可能是,因为隐藏具有同名实例变量的类变量并不罕见。

\n