软件中的有效 class 实例化

Effective class instanciation in software

我编写了一个 coloured_output 模块,其中包含一个名为 ColouredMsg 的 class。 要使用它,我只需要创建一个 ColouredMsg:

的实例
from coloured_output import ColouredMsg
cm = ColouredMsg()

然后这样使用:

warning_msg = cm.warn(*parameters)
error_msg = cm.error(*parameters)

问题是我打算在软件中将此 class 用于控制台日志:

cm = ColouredMsg()
print cm.warn(*parameters)

正如人们可能猜到的那样,几乎在每个模块中都会经常进行此调用。所以在这一点上,我想知道哪种做法最好。要么我坚持这种方式,我将不得不导入模块 coloured_output 并在每个模块的开头声明一个 ColouredMsg 的实例,或者我可以在 coloured_output 模块,像这样:

def warn(*parameters):
    cm = ColouredMsg()
    return cm.warn(*parameters)

然后在我的软件中:

import coloured_output as co
# ...
co.warn(*parameters)

但在这里,每次我想打印一条彩色消息时,我都必须创建一个 ColouredMsg 的实例,这会很重,应该避免。

这让我有了第三种选择,我可以在我的 coloured_output 模块中创建一个 ColouredMsg 的通用实例,它看起来像:

class ColouredMsg():

    def warn(*parameters):
        message = do_whatever_is_needed(*parameters)
        return message

cm = ColouredMsg()

def warn(*parameters):
    return cm.warn(*parameters)

所以我有两个选择:要么在我的每个软件模块中声明一个通用实例,要么在 coloured_output 模块中声明一个通用实例。或者其他我没有想过的东西。

我会接受任何建议。

Daniel 在评论中的建议很好。

但是如果你真的想自己做这个,我建议在模块中使用一个隐藏的实例,而不是在每个函数调用中创建一个新的临时实例。 "hidden instance" 方法在标准库中使用,例如,这就是 random 模块为标准随机函数所做的。