1
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

4 回答 4

2

您可以将类存储在字典中:

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

obj = classes[inputStr]()
于 2013-08-21T09:38:39.587 回答
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]()

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

于 2013-08-21T09:42:28.800 回答
0

另一种方法是将用户输入打包成一个字符串并执行。

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

我知道 exec 是邪恶的 :-)

所以也看看为什么应该执行和评估被避免

于 2013-08-21T09:44:34.577 回答
0

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

独立创建您的子类并在工厂注册它们。然后使用您必须调用工厂的密钥并让它为您实例化所需的类。

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

于 2013-08-21T10:07:24.180 回答