小编典典

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

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

这是难闻的代码气味吗?Python是否提供更优雅的方式来处理此问题?

我的类,甚至一些构造函数都不仅仅是我所展示的,但是我通常有一个传递给构造函数的args列表,最终将它们分配给名称相似的成员。我将一些参数设为可选,以指出执行以下操作时出现的问题:

class MyClass(object):
    def __init__(self, arg_dict):
        self.__dict__ = arg_dict

阅读 115

收藏
2021-01-20

共1个答案

小编典典

如果他们很讨厌,则可以执行以下操作:

def __init__(self, **kwargs):
    for kw,arg in kwargs.iteritems():
        setattr(self, kw, arg)

posargs有点棘手,因为您不会以很好的方式获得命名信息。

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

def __init__(self, **kwargs):
    arg_vals = {
        'param1': 'default1',
        # ...
    }
    arg_vals.update(kwargs)
    for kw,arg in arg_vals.iteritems():
        setattr(self, kw, arg)
2021-01-20