基本方法
class main:
def action_branch(self ,value):
# 定义分支字典
branch = {
'1': self.action1,
'2': self.action2,
'3': self.action3
}
# 以传入参数匹配执行动作
branch.get(value, self.default_action)()
def action1(self):
print("执行动作1")
def action2(self):
print("执行动作2")
def action3(self):
print("执行动作3")
def default_action(self):
print("执行默认动作")
if __name__ == "__main__":
main().action_branch('1')
结合匿名函数 lambda
基本方法一般来说,可以用,但是不好用,不知道大家有没有注意到,branch字典在内存中创建的时候会直接去获取到对应对象(可以理解为以上的action1、action2、action3),但是,如果branch字典在内存中创建的时候任意一个对象在当前时间点是不存在的,有可能只存在其中一个对象,其他所有对象都还不存在,那就会出问题。
所以我们需要一个中间人来传话,而匿名函数 lambda 就很适合当这个中间人的角色,这样branch字典在创建的时候就不是直接获取到目标对象,而是获取到了匿名函数 lambda 对象,而一个函数只有调用了,它里面的代码才会执行,这样我们就实现了延迟加载。
class main:
def action_branch(self ,value):
# 正确的写法:代码运行到这里时,branch并不是去获取text属性,而是获取到了三个lambda函数对象
# 函数没有调用时,它内部的代码是不会执行的
branch = {
'1': lambda: self.action1(self.text1),
'2': lambda: self.action1(self.text2),
'3': lambda: self.action1(self.text3)
}
self.text1 = 'Hello World 1'
self.text2 = 'Hello World 2'
self.text3 = 'Hello World 3'
branch.get(value, self.default_action)()
# -----------------------------分隔线-----------------------------------
# 错误的写法:代码运行到这里时,text属性并未创建,但是branch时却直接去获取了
branch = {
'1': [self.action1,self.text1],
'2': [self.action1,self.text2],
'3': [self.action1,self.text3]
}
self.text1 = 'Hello World 1'
self.text2 = 'Hello World 2'
self.text3 = 'Hello World 3'
branch.get(value, self.default_action)[0]([1])
def action1(self ,value):
print("执行动作1")
print(value)
def default_action(self):
print("执行默认动作")
if __name__ == "__main__":
main().action_branch('1')