我是否可以定义__init__
,以便将**kwargs
中定义的关键字分配给班级?
例如,如果我要使用ValidationRule
初始化ValidationRule(other='email')
类,则应将self.other
的值添加到类中,而不必明确命名每个可能的kwarg。
class ValidationRule:
def __init__(self, **kwargs):
# code to assign **kwargs to .self
答案 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'