Python 如何决定在不使用';如果';陈述
“如果”语句可以处理这种情况。但是,当我有100多个子BaseCl时,如何决定不使用“if”语句创建子类,您可以将您的类存储在字典中: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):
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"