【发布时间】:2013-09-19 12:31:54
【问题描述】:
我需要从一个列表中生成 1000 多个类。
1) 就我而言,我的列表是 NOT 用户指定的。内容可以信任,我自己构建列表内容。因此我可以使用 eval() 而不引入安全风险。但是,我想知道是否有其他方法可以执行 entry = eval(c_class)()
2) 我不想重新使用入口变量,而是想从 class_list_names 构建变量名称。即: 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
问候
【问题讨论】:
-
为什么不像在
declare中那样使用globals()[c_class]()? -
或者你可以让
declare返回生成的类对象,然后使用它。
标签: python class variables dynamic python-3.x