Python pyreverse 可以生成函数的 UML 图吗?
Can Python pyreverse generate UML diagram for functions?
pyreverse 是从 Python 代码生成 UML 图的好工具。但是,我发现它无法识别函数中使用的所有 classes。我举下面的例子来说明我的观点:
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生成class图,很明显我们可以看到ClassB
是ClassC
中的一个组件。但是,它无法生成与 ClassA
的关系,该关系在其函数 perform
中使用。 pyreverse 有没有办法检索 ClassC
和 ClassA
之间的关系?
原因是scope of object_a
: it is a local variable of the function and not an instance variable. The relationship of C with A is therefore not structural. Hence, it is not an UML association(也不是聚合,也不是组合)。
充其量,我们可以说存在从 C 到 A 的用法依赖性。但这种用法是特定于实现的,不一定是设计的意思。
我不是 Python 专家,但如果 pyreverse 能够发现与 object_b
的正确关系,并且如果你将 object_a
设为实例变量 self.object_a
在作业中,你可以希望得到你期望的结果。
编辑:实验验证
如果 class C 按说明更正:
class ClassC(object):
def __init__(self):
self.object_b = ClassB()
def perform(self):
self.object_a = ClassA()
pyreverse 确实生成了预期的正确结果:
对于人类 reader,很容易错过 属性。这就是 pylint 对这段代码发出警告的原因:
W0201: Attribute 'object_a' defined outside __init__ (attribute-defined-outside-init)
另请注意,如果您定义 (static) class variable 而不是实例变量,pyreverse 不会显示带有下划线的名称。原因可能是,因为用同名实例变量隐藏 class 变量并不少见。
pyreverse 是从 Python 代码生成 UML 图的好工具。但是,我发现它无法识别函数中使用的所有 classes。我举下面的例子来说明我的观点:
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生成class图,很明显我们可以看到ClassB
是ClassC
中的一个组件。但是,它无法生成与 ClassA
的关系,该关系在其函数 perform
中使用。 pyreverse 有没有办法检索 ClassC
和 ClassA
之间的关系?
原因是scope of object_a
: it is a local variable of the function and not an instance variable. The relationship of C with A is therefore not structural. Hence, it is not an UML association(也不是聚合,也不是组合)。
充其量,我们可以说存在从 C 到 A 的用法依赖性。但这种用法是特定于实现的,不一定是设计的意思。
我不是 Python 专家,但如果 pyreverse 能够发现与 object_b
的正确关系,并且如果你将 object_a
设为实例变量 self.object_a
在作业中,你可以希望得到你期望的结果。
编辑:实验验证
如果 class C 按说明更正:
class ClassC(object):
def __init__(self):
self.object_b = ClassB()
def perform(self):
self.object_a = ClassA()
pyreverse 确实生成了预期的正确结果:
对于人类 reader,很容易错过 属性。这就是 pylint 对这段代码发出警告的原因:
W0201: Attribute 'object_a' defined outside __init__ (attribute-defined-outside-init)
另请注意,如果您定义 (static) class variable 而不是实例变量,pyreverse 不会显示带有下划线的名称。原因可能是,因为用同名实例变量隐藏 class 变量并不少见。