2013-09-15 6 views
1

Мне нужно сгенерировать 1000 классов из списка.Объявление динамического класса с использованием переменной для обозначения класса и ссылки на переменные для динамического класса

1) В моем случае мой список: NOT пользователь указал. Контент можно доверять, я сам создаю содержимое списка. Поэтому я могу использовать eval() без риска для безопасности. Тем не менее, я хотел бы знать, есть ли альтернативные способы ввода entry = eval (c_class)()

2) Вместо повторного использования переменной ввода я хотел бы построить имена переменных из class_list_names. I.e .: rak_entry = rak() ... bak_entry = bak().

exec("entry_"+c_class +" = eval(c_class)()") 

Существуют ли другие способы, чем использовать Exec с Eval?

Вот мой код

class_list_names = ['rak', 'bak', 'sak', 'mak'] 

class pattern_class(object): 
    generic_attr = "bla" 

def declare(classname): 
    globals()[classname] = type(classname, (pattern_class,), {'__tablename__' : classname+"_daily_history"}) 

for c_class in class_list_names: 
    declare(c_class) 
    entry = eval(c_class)() 
    print(entry) 
    print(entry.__tablename__) 
    print(entry.generic_attr) 

выход

<__main__.rak object at 0x0242D950> 
rak_daily_history 
bla 
<__main__.bak object at 0x0242DA10> 
bak_daily_history 
bla 
<__main__.sak object at 0x0242D9B0> 
sak_daily_history 
bla 
<__main__.mak object at 0x0242D950> 
mak_daily_history 
bla 

С уважением

+0

Почему вы не используете 'globals() [c_class]()', как вы это делали в 'declare'? – falsetru

+0

Или вы можете заставить 'declare' возвращать сгенерированный объект класса, а затем использовать его. – falsetru

ответ

0

сделать declare вернуть сгенерированный класс.

class pattern_class(object): 
    generic_attr = "bla" 

def declare(classname): 
    return type(classname, (pattern_class,), {'__tablename__' : classname+"_daily_history"}) 

class_list_names = ['rak', 'bak', 'sak', 'mak'] 
for name in class_list_names: 
    cls = declare(name) 
    globals()[name + '_entry'] = cls() 

print rak_entry.__tablename__, bak_entry.__tablename__, sak_entry.__tablename__, mak_entry.__tablename__ 
+0

Я не думал об использовании globals() [c_class](), который отлично работает. Он отвечает на мой первый вопрос. Однако для моего второго вопроса я не могу написать имя переменных вручную (rak_entry, ...), потому что у меня будет более 1000 классов. – Lazik

+0

@ Lazik, я редактировал код. Проверьте это. – falsetru

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