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 ответа:
Когда вы назначаете
self.k
, вы на самом деле не создаете атрибут с именемvalue ofk
, Вы просто создаете атрибут с именем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))