改进__init__,其中args直接分配给成员

Col*_*lin 5 python

我发现自己用这样的构造函数编写了很多类:

class MyClass(object):
    def __init__(self, foo, bar, foobar=1, anotherfoo=None):
        self.foo = foo
        self.bar = bar
        self.foobar = foobar
        self.anotherfoo = anotherfoo
Run Code Online (Sandbox Code Playgroud)

这是一个糟糕的代码味道吗?Python是否提供了更优雅的处理方式?

我的类甚至一些构造函数不仅仅是我所展示的,但我通常有一个args列表传递给构造函数,最终被分配给类似命名的成员.我做了一些可选的参数来指出这样做的问题:

class MyClass(object):
    def __init__(self, arg_dict):
        self.__dict__ = arg_dict
Run Code Online (Sandbox Code Playgroud)

Amb*_*ber 8

如果他们是kwargs,你可以这样做:

def __init__(self, **kwargs):
    for kw,arg in kwargs.iteritems():
        setattr(self, kw, arg)
Run Code Online (Sandbox Code Playgroud)

posargs有点棘手,因为你没有以一种很好的方式获得命名信息.

如果要提供默认值,可以这样做:

def __init__(self, **kwargs):
    arg_vals = {
        'param1': 'default1',
        # ...
    }
    arg_vals.update(kwargs)
    for kw,arg in arg_vals.iteritems():
        setattr(self, kw, arg)
Run Code Online (Sandbox Code Playgroud)