1

我需要从列表中生成 1000 多个类。

1)就我而言,我的列表不是用户指定的。内容可以信任,我自己构建列表内容。因此我可以使用 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

问候

4

1 回答 1

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__
于 2013-09-15T07:02:34.223 回答