反射的使用
根据输入的内容执行对应的操作
采用逻辑判断方式:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class CName(): 2 def __init__(self,s): 3 self.s = s 4 5 def say_Z(self): 6 print('I am ZZZ') 7 8 def say_0(self): 9 print('I am 000') 10 11 def say_other(self): 12 print('other') 13 14 def say(self): # 此处举例使用的是很简单的代码,如果代码逻辑很复杂,采用if...else...的逻辑判断结构会导致代码冗余,不易阅读;且需要吧所有的可能都考虑进来,需要罗列出很多判断 15 if self.s == '0': 16 self.say_0() 17 elif self.s == 'Z': 18 self.say_Z() 19 else: 20 self.say_other() 21 22 if __name__ == '__main__': 23 while True: 24 s = input('请输入要说的内容:') 25 o = CName(s) 26 o.say() 27 o.say()
执行结果:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 C:\Users\lwj\AppData\Local\Programs\Python\Python37\python.exe D:/02Project/pacho/08day/反射/st_反射.py 2 请输入要说的内容:0 3 I am 000 4 I am 000 5 请输入要说的内容:c 6 other 7 other 8 请输入要说的内容:Z 9 I am ZZZ 10 I am ZZZ 11 请输入要说的内容:
采用字典的方式——待补充,根据key获取到value,然后执行对应的方法
采用反射的方式:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 根据输入的内容选择处理的逻辑 2 class CName(object): 3 def __init__(self, s): 4 self.s = 'say_'+str(s) 5 6 def say_Z(self): 7 print('I am ZZZ') 8 9 def say_0(self): 10 print('I am 000') 11 12 def say_other(self): 13 print('other') 14 15 def say(self): 16 if hasattr(self,self.s): # 如果有该属性 17 f = getattr(self,self.s) # 则获取该属性,此处若要获取该属性的返回值则使用f = getattr(self,self.s()) 18 f() # 若要获取该属性的返回值则使用 return f 19 else: 20 setattr(self,self.s,self.say_other) # 如果没有该属性,则设置该属性为say_other 21 22 if __name__ == '__main__': 23 while True: 24 s = input('请输入要说的内容:') 25 o = CName(s) 26 o.say() 27 o.say()
执行结果:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 C:\Users\lwj\AppData\Local\Programs\Python\Python37\python.exe D:/02Project/pacho/08day/反射/st_反射.py 2 请输入要说的内容:0 3 I am 000 4 I am 000 5 请输入要说的内容:Z 6 I am ZZZ 7 I am ZZZ 8 请输入要说的内容:c 9 other 10 请输入要说的内容:0 11 I am 000 12 I am 000 13 请输入要说的内容:
注意看,采用反射,当找不到属性时,我们为该属性设置了方法。所以第二次调用的时候才会生效,如果想要直接生效可以再次执行。
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 根据输入的内容选择处理的逻辑 2 class CName(object): 3 def __init__(self, s): 4 self.s = 'say_'+str(s) 5 6 def say_Z(self): 7 print('I am ZZZ') 8 9 def say_0(self): 10 print('I am 000') 11 12 def say_other(self): 13 print('other') 14 15 def say(self): 16 if hasattr(self,self.s): # 如果有该属性 17 f = getattr(self,self.s) # 则获取该属性,此处若要获取该属性的返回值则使用f = getattr(self,self.s()) 18 f() # 若要获取该属性的返回值则使用 return f 19 else: 20 setattr(self,self.s,self.say_other) # 如果没有该属性,则设置该属性为say_other 21 f_1 = getattr(self,self.s) 22 f_1() 23 24 25 if __name__ == '__main__': 26 while True: 27 s = input('请输入要说的内容:') 28 o = CName(s) 29 o.say() 30 o.say()
执行结果:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 C:\Users\lwj\AppData\Local\Programs\Python\Python37\python.exe D:/02Project/pacho/08day/反射/st_反射.py 2 请输入要说的内容:0 3 I am 000 4 I am 000 5 请输入要说的内容:Z 6 I am ZZZ 7 I am ZZZ 8 请输入要说的内容:c 9 other 10 other 11 请输入要说的内容:0 12 I am 000 13 I am 000 14 请输入要说的内容: