如何用抽象类为python画UML图

问题描述 投票:0回答:1

我有一个基础抽象类

Function
和子类
ExpFunction
LogFunction
CubicFunction
。我有如下主课:

class Main:
    """
    Main class to run the program
    """

    def __init__(self):
        self.f_1 = ExpFunction("Exponential", 0.0, 1.0, 3.0, -5.0, 0)
        self.f_2 = LogFunction("Logarithmic", 0.0001, 0.05, 3.0, 10.0, 0.001)
        self.f_3 = CubicFunction("f3", 1.0, 2.0, 2.0, -3.0, 4.0, -5.0, 0.0001)

    def _run(self):
        """
        Run the program
        """
        print("Starting the program...\n\n")
        self.f_1.print_function()
        self.f_1.find_roots()

        self.f_2.print_function()
        self.f_2.find_roots()

        self.f_3.print_function()
        self.f_3.find_roots()

        print("Program finished.")

    def __call__(self, *args, **kwds):
        self._run()


if __name__ == "__main__":
    main = Main()
    main()

我画了下图: enter image description here

这是正确的图表吗?

python inheritance uml abstract-class class-diagram
1个回答
0
投票

抽象类和操作

我们不能说

Function
和它的3个特化是否正确,因为我们没有相应的代码。但是如果它是抽象的,它应该在图中显示(斜体类名),并且您在 3 个专业化中的每一个中都明确定义的抽象操作(也称为 python 中的成员函数)也应该如此显示。

这才是真正的设计吗?

在您的代码片段中,

Main
f_1
f_2
f_3
。你的图表说这些总是
LogFunction
ExpFunction
CubicFunction
。 考虑到当前的代码,这并没有错。

但是,没有什么能阻止您将

f_1
f_2
f_3
更改为其他类型的
Function
,或者以不同的方式初始化它们,因为 您只使用它们的公共抽象接口。所以你也可以显示
Main
与 3
Function
相关联,并将其留给运行时来决定实例化哪个函数。这也是正确的,并且最好使用抽象类允许的抽象和多态性。

由于您的代码没有给出 type 提示,并且由于 python 是动态类型的,我们无法判断这两种替代设计中哪一种是正确的。只有你知道你打算做什么。

顺便说一句,随意删除共享聚合(空心菱形):UML 没有为共享聚合定义任何语义(20 多年以来!):一个简单的关联将表达完全相同的东西。

© www.soinside.com 2019 - 2024. All rights reserved.