【问题标题】:Can Python pyreverse generate UML diagram for functions?Python pyreverse 可以为函数生成 UML 图吗?
【发布时间】:2021-10-28 16:58:09
【问题描述】:

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生成类图,很明显我们可以看到ClassBClassC内部的一个组件。但是,它无法生成与ClassA 的关系,它在其函数perform 中使用。 pyreverse有什么方法可以检索ClassCClassA之间的关系?

【问题讨论】:

  • 我不知道 pyreverse,但代码分析通常不是这些工具的一部分。不幸的是,这个对象创建是运行时 Python 明智的。它是一种解释性语言。那些类 C 语言具有可以找到这些关联的标题。我想您需要向 pyreverse 开发人员发送功能请求。

标签: python uml pylint class-diagram pyreverse


【解决方案1】:

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

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

我不是 Python 专家,但如果 pyreverse 能够发现与 object_b 的正确关系,并且如果您在赋值中将 object_a 设为带有 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)

还请注意,如果您定义 (static) class variable 而不是实例变量,pyreverse 不会用带下划线的名称显示它。原因很可能是,隐藏类变量与同名实例变量的情况并不少见。

【讨论】:

    猜你喜欢
    • 2011-08-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2017-12-27
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多