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子项时,
答案 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是邪恶的: - )
答案 3 :(得分:0)
这是工厂模式的完美案例。
独立创建子类并将其注册到工厂。然后使用你所拥有的密钥来调用工厂并让它为你实例化所需的类。
最简单的工厂是字典,但您也可以构建一个具有附加功能的漂亮工厂类。