更有效的方法来创建不同类的类实例?

时间:2018-03-07 21:53:20

标签: python python-3.x class oop initialization

我们假设我们有一个函数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 ...

有更有效的方法吗?这是很多重复,所以它几乎肯定意味着这是一种错误的方法。

2 个答案:

答案 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包含格式化为代码的字符串,则可能更危险,因此请务必清理运行此代码之前的字符串。