Python pyreverse能为函数生成UML图吗?

2024-05-13 17:20:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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之间的关系


Tags: 函数selfobject关系initdefpassperform
1条回答
网友
1楼 · 发布于 2024-05-13 17:20:27

原因是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确实产生了预期的正确结果:

enter image description here

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

W0201: Attribute 'object_a' defined outside __init__ (attribute-defined-outside-init)

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

相关问题 更多 >