动态类声明,使用变量命名类和变量引用动态类

时间:2013-09-15 06:50:02

标签: python class variables dynamic python-3.x

我需要从列表中生成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

此致

1 个答案:

答案 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__