简单地说,我明白为什么我不能使用for
循环使用**kwargs
来设置属性,如下所示:
class Person():
def __init__(self, onevar, *args, **kwargs):
self.onevar = onevar
for k in kwargs:
self.k = kwargs[k]
print(k, self.k)
def run():
ryan = Person('test', 4, 5, 6, name='ryan', age='fifty')
print(ryan.name)
def main():
run()
if __name__=="__main__":
main()
返回以下内容:
AttributeError: 'Person' object has no attribute 'name'
任何人都知道为什么?
答案 0 :(得分:5)
当您指定self.k
而未实际创建名为k
的值的属性时,您只需创建一个名为{{的属性1}}反复。如果我了解您正在尝试做什么,则需要替换
k
与
self.k = kwargs[k]
实现你想要的目标。
答案 1 :(得分:0)
编辑:@ tzaman的回答更好。按照他的建议使用setattr
。
您希望k
成为变量,但它不会那样工作。但是,您可以在Python中扩展基础object
并使用内部__dict__
属性设置变量。
您也可以使用iteritems()
直接获取值。
class Person(object):
def __init__(self, onevar, *args, **kwargs):
self.onevar = onevar
for k,v in kwargs.iteritems():
self.__dict__[k] = v
print(k, self.__dict__.get(k))