我如何将** kwargs复制到自己?

时间:2010-03-29 05:21:06

标签: python syntax constructor kwargs

我是否可以定义__init__,以便将**kwargs中定义的关键字分配给班级?

例如,如果我要使用ValidationRule初始化ValidationRule(other='email')类,则应将self.other的值添加到类中,而不必明确命名每个可能的kwarg。

class ValidationRule:
    def __init__(self, **kwargs):
        # code to assign **kwargs to .self

7 个答案:

答案 0 :(得分:20)

我认为somewhere on the stackoverflow我见过这样的解决方案。无论如何它看起来像:

class ValidationRule:
    __allowed = ("other", "same", "different")
    def __init__(self, **kwargs):
        for k, v in kwargs.iteritems():
            assert( k in self.__class__.__allowed )
            setattr(self, k, v)

此类仅接受具有__allowed中列出的白名单属性名称的参数。

答案 1 :(得分:14)

这可能不是最干净的方式,但它有效:

class ValidationRule: 
    def __init__(self, **kwargs): 
        self.__dict__.update(kwargs)

我认为我更喜欢ony's solution,因为它会限制可用的属性,以便在您的输入来自外部来源时避免麻烦。

答案 2 :(得分:12)

你可以这样做:

class ValidationRule:
   def __init__(self, **kwargs):
      for (k, v) in kwargs.items():
         setattr(self, k, v)

答案 3 :(得分:4)

class ValidationRule:
   def __init__(self, **kwargs):
      self.__dict__.update(kwargs)

答案 4 :(得分:2)

您可以通过更新实例的kwargs属性来设置__dict__参数。

class ValidationRule:
   def __init__(self, **kwargs):
       self.__dict__.update(kwargs)

答案 5 :(得分:2)

这可以被认为比更新__dict__更好:

class C:
    def __init__(self, **kwargs):
        vars(self).update(kwargs)

>>> c = C(a='a', b='b')
>>> c.a   # returns 'a'
>>> c.b   # returns 'b'

答案 6 :(得分:0)

我发现上述答案有用而且经过改进:

class MyObj(object):
    def __init__(self, key1=1, key2=2, key3=3):
        for (k, v) in locals().iteritems():
            if k != 'self':
                setattr(self, k, v)

测试:

>>> myobj = MyObj(key1=0)
>>> print myobj.key1
0

验证也在那里:

>>> myobj = MyObj(key4=4)
TypeError: __init__() got an unexpected keyword argument 'key4'