【问题标题】:Dynamic class declaration, using variable to name class and variable reference to dynamic class动态类声明,使用变量命名类和变量引用动态类
【发布时间】: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


【解决方案1】:

使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__

【讨论】:

  • 我没想过使用效果很好的 globals()[c_class]()。它回答了我的第一个问题。但是对于我的第二个问题,我不能手动编写变量名称(rak_entry,...),因为我将拥有 1000 多个类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多