我需要从列表中生成1000多个类。
1)就我而言,我的列表是 NOT 用户指定的。内容可以信任,我自己构建列表内容。因此,我可以使用eval()而不会带来安全风险。但是,我想知道是否有替代方法可以进行输入= eval(c_class)()
2)我不想重复使用entry变量,而是想从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 :(得分: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__