我正在寻找一种优雅的方式来初始化许多对象。

假设我有一个 Utils 模块,它有一个到 SVN、Git、Make 和其他东西的接口(interface)。

目前,我是这样做的:

from Utils.Config import Config, Properties
from Utils.Utils import PrettyPrint, SVN, Make, Bash, Git

class Build(object):

    def __init__(self):
        self.config = Config()
        self.make = Make()
        self.env = Properties()
        self.svn = SVN()
        self.git = Git()
        self.bash = Bash()
        self.pretty_print = PrettyPrint()

而且……好吧,看起来不太好。

有没有办法以更优雅的方式做到这一点?我想这可能是一个设计问题,但我不知道如何解决这个问题。

我正在考虑创建 Base class,它将在 Utils 模块中初始化所有这些类。你怎么看?

最佳答案

我不会创建一个类并将其作为基础,这似乎有点矫枉过正,方法过于庞大。

相反,您可以创建一个辅助函数,帮助函数,它带有 selfsetattr。来自 collections 的几个对象的示例如下所示:

from collections import UserString, deque, UserDict

def construct(instance, classes = (UserString, deque, UserDict)):
    for c in classes:
        setattr(instance, c.__name__.lower(), c([]))

您的情况也很适合,因为您的对象不需要一些初始值,因此您可以以相同的方式概括和处理它们:-)。

现在您的示例类可以使用 construct() 中的默认值调用 __init__ 并完成:
class Foo:
    def __init__(self):
        construct(self)
construct 函数当然可以根据需要在 Utils 中定义,或者作为类中的方法。

关于python - 以优雅的方式初始化多个对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39500940/

10-12 22:18