0

我对初始化课程的最佳实践有疑问。考虑一个复杂且有很多成员的类。在外部初始化它们是不好的做法,但是如果没有大量的方法__init__(),我该如何处理这个问题。__init__()

一个例子:

class A:
   def __init__(self):
       self.member0 = "a"

       # to prevent that the init method gets too big
       # put some initialisation outside
       init_other_stuff()

   def init_other_stuff(self):
       self.member1 = "b"
       self.member2 = "c"
       ...

提前致谢。

[更新]澄清。当然,目标不是将这些东西放入另一个长方法中。相反,您可以将初始化拆分为不同的部分,例如:

def init_network_stuff(self):
    """ init network setup """
    self.my_new_socket = socket.socket(..)


def init_local_stuff(self):
    """ init local setup """
    self.my_new_logpath = "/foo/bar/log"

...
4

1 回答 1

0

我也同意拥有太多属性可能是抽象不足的标志,这通常更难开发和调试,因此更改您的设计可能是一个好主意。

但是,你确实有一个金徽章,所以你显然已经在附近并且(可能)知道你在做什么,并且可能有理由这样做。在这种情况下,我认为按照您的建议按类别拆分初始化是个好主意。我唯一的建议是在子初始化函数上使用 _ 来向用户发出信号,它们不适合正常使用,即

class A:
def __init__(self):
    self.member0 = "a"

    self.__init_other_stuff()

def __init_other_stuff(self):
   self.member1 = "b"
   self.member2 = "c"

等等。这也将它们从大多数控制台和编辑器中的选项卡完成中隐藏起来。

如果您确实需要 A 直接包含这些项目,则您的另一个选择是使此类成为实现部分接口的多个类的子类,即执行以下操作:

class Logger(object):
    def __init__(self):
        self.logparam = 1

class NetworkSource(object):
    def __init__(self):
        self.netparam = 2

class A(Logger, NetworkSource):
    def __init__(self):
        Logger.__init__(self)
        NetworkSource.__init__(self)

In [2]: a = A()

In [3]: a.<tab>
a.logparam a.netparam

然后它将获得两个类的功能,同时具有相对较短的初始化。尽管恕我直言,多重继承在概念上有点复杂。

于 2013-10-02T13:30:10.447 回答