如何将**kwargs复制到self?
有没有办法让我在定义 __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的解决方案,因为它限制了可用的属性,这样在你的输入来自外部来源时,可以避免一些麻烦。