我们假设我们有一个函数classes_init
。它接收列表或其他类型的信息,用于初始化不同类型的类的许多实例,例如:
["spam", 24]
["eggs", 10]
["bacon", 20]
...
这些列表的索引0表示它应该是什么类型的类。我发现初始化特定类的实例的最佳方法是通过以下方式:
def classes_init(xlists):
classlist = list()
if xlists[0] == "spam":
classlist.append(Spam(number=xlists[1]))
elif xlists[0] == "eggs":
classlist.append(Eggs(number=xlists[1]))
elif xlists[0] == "bacon":
classlist.append(Bacon(number=xlists[1]))
... and so on ...
有更有效的方法吗?这是很多重复,所以它几乎肯定意味着这是一种错误的方法。
答案 0 :(得分:7)
使用字典将字符串映射到类:
class_map = {
'spam': Spam,
'eggs': Eggs,
'bacon': Bacon,
}
def classes_init(xlists):
classlist = [class_map[name](argument) for name, argument in xlists]
如果所有字符串都与小写名称相对应,则可以从类名创建类映射:
classes = (Spam, Eggs, Bacon)
class_map = {cls.__name__.lower(): cls for cls in classes}
答案 1 :(得分:-2)
删除if-elif
结构并将其添加到您的代码:
exec("classList.append(" + xlists[0].title() + "(number = xlists[1])")
这样,与将dict
手动输入数据相比,需要更少的内存和更少的时间,但如果xlists
包含格式化为代码的字符串,则可能更危险,因此请务必清理运行此代码之前的字符串。