避免在实例化类时使用其他方法-python

时间:2018-08-01 07:07:22

标签: python design-patterns switch-statement conditional

我想基于一个字段的值创建一个类的对象。

例如:

if r_type == 'abc':
                return Abc()
            elif r_type == 'def':
                return Def()
            elif r_type == 'ghi':
                return Ghi()
            elif r_type == 'jkl':
                return Jkl()

在这里避免出现其他情况的pythonic方式是什么。我当时正在考虑创建一个以r_type为键,classname为值的字典,并获取值并实例化,这是一种正确的方法,还是python中有一种更好的惯用方式?

3 个答案:

答案 0 :(得分:6)

您可以利用以下事实:类是python中的first class objects,并使用字典来访问要创建的类:

classes = {'abc': Abc,    # note: you store the object here
           'def': Def,    #       do not add the calling parenthesis
           'ghi': Ghi,
           'jkl': Jkl}

然后创建这样的类:

new_class = classes[r_type]()  # note: add parenthesis to call the object retreived

如果您的班级需要参数,则可以像创建普通班级一样放置它们:

new_class = classes[r_type](*args, *kwargs)

答案 1 :(得分:3)

dict.get(..)(感谢Eran Moshe的编辑):

classes = {'abc': Abc,
           'def': Def,
           'ghi': Ghi,
           'jkl': Jkl}


new_class = classes.get(r_type, lambda: 'Invalid input')()

答案 2 :(得分:2)

使用dict的最佳方法,因为列表键操作的复杂性是恒定的,所以它也将处理动态操作。

cf = {
    'abc': Abc,
    'def': Def,
    'ghi': Ghi,
    'jkl': Jkl,
}
r_type = input('value:')
class_obj = cf.get(r_type, None)
if class_obj:
   class_obj()