如何将**kwargs复制到self?

24 投票
7 回答
12436 浏览
提问于 2025-04-15 20:58

有没有办法让我在定义 __init__ 的时候,把 **kwargs 里定义的关键字参数直接赋值给类的属性呢?

举个例子,如果我想用 ValidationRule(other='email') 来初始化一个 ValidationRule 类,那么 self.other 的值应该自动添加到这个类里,而不需要我一个一个地列出所有可能的关键字参数。

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

7 个回答

13

你可以这样做:

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

我记得在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中列出的允许的属性名称作为参数。

20

这可能不是最干净的方法,但它能奏效:

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

我觉得我更喜欢 ony的解决方案,因为它限制了可用的属性,这样在你的输入来自外部来源时,可以避免一些麻烦。

撰写回答