Python3 AttributeError при настройке свойств с помощью * * kwargs


Проще говоря, я понимаю, почему я не могу установить свойство, используя цикл 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 3

2 ответа:

Когда вы назначаете self.k, вы на самом деле не создаете атрибут с именемvalue of k, Вы просто создаете атрибут с именем k повторно. Если я понимаю, что вы пытаетесь сделать, вам нужно заменить

self.k = kwargs[k]

С

setattr(self, k, kwargs[k])

Чтобы достичь того, чего вы хотите.

EDIT : ответ @tzaman лучше. Используйте setattr, как он предлагает.

Вы ожидаете, что k станет переменной, но это не работает таким образом. Однако вы можете расширить базу object в Python и задать переменные, используя внутреннее свойство __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))