Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何决定在不使用';如果';陈述_Python_Class_Dynamic_If Statement - Fatal编程技术网

Python 如何决定在不使用';如果';陈述

Python 如何决定在不使用';如果';陈述,python,class,dynamic,if-statement,Python,Class,Dynamic,If Statement,“如果”语句可以处理这种情况。但是,当我有100多个子BaseCl时,如何决定不使用“if”语句创建子类,您可以将您的类存储在字典中: class BaseCls: def foo(self): print("BaseCls") class ChildClsA(BaseCls): def foo(self): print("ChildClsA") class ClildClsB(BaseCls): def foo(self):

“如果”语句可以处理这种情况。但是,当我有100多个子BaseCl时,如何决定不使用“if”语句创建子类,

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

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()

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

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

obj = classes[inputStr]()
重新导入
lookup={re.search('([A-Z][A-Za-Z_uz]*$),cls.uuu name_uuuuu).group(1):BaseCls中cls的cls。uuuu子类_uuuuu()}
#{'A':,'B':}
input_str=raw_input('请输入{}:'中的一个。格式(','.join(查找)))
new_class=查找[input_str]()

注意:使用任何有意义的条件提取名称以进行查找

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

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]()
我知道exec是邪恶的:-)


因此,也请看一看

这是一个工厂模式的完美案例

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


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

100个孩子?对我来说,这听起来像是一个痛苦的设计。好吧,这不是最“简单化”的方式,而是+1,因为这是一个非常棒的方式。
input_ = raw_input( "Please enter the class name:" )
try:
    exec( "%s().foo()" % input_ )
except NameError:
    print "Invalid class name entered"