20

有没有一种方法可以定义__init__,以便将定义的关键字**kwargs分配给类?

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

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

7 回答 7

31

我认为在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

于 2010-03-29T05:35:55.530 回答
20

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

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

我认为我更喜欢ony 的解决方案,因为当您的输入来自外部来源时,它会限制可用属性以使您免受麻烦。

于 2010-03-29T05:39:49.067 回答
12

你可以这样做:

class ValidationRule:
   def __init__(self, **kwargs):
      for (k, v) in kwargs.items():
         setattr(self, k, v)
于 2010-03-29T05:25:08.343 回答
4
class ValidationRule:
   def __init__(self, **kwargs):
      self.__dict__.update(kwargs)
于 2010-03-29T05:39:08.630 回答
3

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

class ValidationRule:
   def __init__(self, **kwargs):
       self.__dict__.update(kwargs)
于 2010-03-29T05:40:21.890 回答
3

这可以被认为比更新更好__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'
于 2015-10-28T12:18:24.543 回答
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'
于 2012-01-17T21:45:43.420 回答