如何在不使用'if'语句的情况下决定创建子类

时间:2013-08-21 09:32:13

标签: python class dynamic if-statement

class BaseCls:
    def foo(self):
        print("BaseCls")

class ChildClsA(BaseCls):
    def foo(self):
        print("ChildClsA")

class ClildClsB(BaseCls):
    def foo(self):
        print("ChildClsB")



inputStr=raw_input("press A or B\n")

if(inputStr=="A"):
    obj=ChildClsA()
if(inputStr=="B"):
    obj=ClildClsB()

obj.foo()

'if'语句可以处理这种情况。但是,如何在不使用'if'语句的情况下决定创建子类当我有超过一百个BaseCls子项时,

4 个答案:

答案 0 :(得分:2)

您可以将课程存储在字典中:

classes = dict(A=ChildClsA, B=ChildClsB)

obj = classes[inputStr]()

答案 1 :(得分:0)

我会仔细检查你的设计,但是一种简单的方法是从你的基础创建有效子类的查找:

import re
lookup = {re.search('([A-Z][A-Za-z_]*$)', cls.__name__).group(1): cls for cls in BaseCls.__subclasses__()}
# {'A': <class '__main__.ChildClsA'>, 'B': <class '__main__.ClildClsB'>}

input_str = raw_input('Please enter one of {}:'.format(', '.join(lookup)))
new_class = lookup[input_str]()

注意:使用任何有意义的标准来提取名称以便查找

答案 2 :(得分:0)

另一种方法是将用户输入打包为字符串和执行。

input_ = raw_input( "Please enter the class name:" )
try:
    exec( "%s().foo()" % input_ )
except NameError:
    print "Invalid class name entered"

我知道exec是邪恶的: - )

所以还要看看why-should-exec-and-eval-be-avoided

答案 3 :(得分:0)

这是工厂模式的完美案例。

独立创建子类并将其注册到工厂。然后使用你所拥有的密钥来调用工厂并让它为你实例化所需的类。

最简单的工厂是字典,但您也可以构建一个具有附加功能的漂亮工厂类。