使用** kwargs设置属性时的Python3 AttributeError

时间:2014-09-04 04:03:50

标签: python attributeerror

简单地说,我明白为什么我不能使用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'

任何人都知道为什么?

2 个答案:

答案 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))