Python的初始化(Python initialization)

2019-09-17 23:42发布

我有这样的代码:

def __init__(self, a, b, c, d...):
   self.a = a
   self.b = b
   etc

我想用替换它的:

def __init__(self, a, b, c, d...):
   args=locals()
   for key in args:
     self.__dict__[key] = args[key]

这是一个坏主意吗? 是否有更好的方式来做到这一点?

Answer 1:

建立在@ ThiefMaster的有关评论**kwargs

如果你在20个参数服用,它可能会更有意义,要求用户通过关键字发送参数,而不是位置:20个争论,有一个像样的机会,有人使用您的代码就会参数顺序错误。

考虑同时具有要接受键的预定义列表和提高一个ValueError,如果你不接受他们接受kwargs。 所以,你可以使用**kwargs ,然后检查一切都在那里。 例如

INITIAL_ARGS = set(['a','b','c','d','e'...])

def __init__(self, **kwargs):
    if not INITIAL_ARGS.issubset(set(kwargs.iterkeys())):
        raise ValueError("Class <myclass> requires 20 keyword arguments"
                          "only given %d" % len(kwargs))
    self.__dict__.update(kwargs)

不知道这是否是多还是比你原来少了Python的,但它似乎将节省大量的时间以后试图找出为什么有人使用你的代码可能会得到奇怪的错误时。



Answer 2:

从Python的禅 : 简单比复杂好。可读性计数。

在明确的分配更可读,也比使用魔法设置的值简单。



Answer 3:

始终考虑过巧妙设计可读性。 是更换代码更易于阅读? 我可能只是离开它。 请记住,简单比复杂好。 正如ThiefMaster说,在明确的分配更具可读性。



Answer 4:

另一种方法为Python3网友: init从装饰激烈 。

@init
def __init__(self, a, b, c, d, e, f, g, h):
    # nothing to write here!


文章来源: Python initialization