2014-02-14 9 views
0

Я сталкиваются с проблемами, добавляющие атрибуты класса динамически из списка строк, рассмотрим следующий сценарий:питон динамически создавать атрибуты класса

Это мой класс:

class Customer(object): 
    def __init__(self,**kw): 
     self.__dict__ = kw 

    def add_attributes(self,**kw): 
     self.__dict__.update(kw) 

#a group of attributes i want to associate with the class 
list = [] 
list.append("name") 
list.append("age") 
list.append("gender") 

Customer c 

for i in list: 
    # i is the attribute name for the class 
    c.add_attributes(i = "test") 

Проблема, кажется, тот факт, что он обрабатывает имя атрибута в виде строки, может кто-то пожалуйста, сообщите

+0

c = Клиент(), это ошибка? –

+0

Вы должны исправить отступ. –

+0

OT: не используйте «список» в качестве переменной, иначе это переопределит стандартную функцию «список» ... – Don

ответ

2

i = "test" фактически преобразуется в {'i':'test'} при передаче **kwargs внутри add_attributes, так что вам нужно сделать это mething так:

for i in my_list: 
    c.add_attributes(**{ i : "test"}) 
+1

спасибо, что сработало, можете ли вы объяснить, как это работает? – godzilla

+1

Это производит словари с 'i' в качестве ключа и' 'test'' в качестве значения, а затем использует синтаксис' ** kw' для применения словаря в качестве ключевых слов к методу 'c.add_attributes()'. –

+0

@godzilla Читать о аргументах ключевых слов: http://docs.python.org/2/tutorial/controlflow.html#keyword-arguments –

1

Вместо непосредственного обновляя __dict__, вы можете использовать setattr встроенный метод:

for i in list: 
    # i is the attribute name for the class 
    setattr(c, i, "test") 

На мой взгляд, играть с внутренними атрибутами должен быть последним средством.

0

Вместо для цикла, вы можете использовать dict.fromkeys:

c.add_attributes(**dict.fromkeys(seq, "test")) 

так

In [13]: dict.fromkeys(seq, "test") 
Out[13]: {'age': 'test', 'gender': 'test', 'name': 'test'} 

** говорит Python распаковать Dict в ключевых аргументов. Синтаксис объясняется here и в docs, here.


Кстати, лучше не использовать list в качестве имени переменной, поскольку она затрудняет доступ к встроенной команды с таким же именем.

Смежные вопросы