反射的使用
反射的作用:通过字符串去匹配对象中的成员(成员一般指模块中的函数)。
例1:
1 py1.py 2 def login(): 3 print("登录") 4 def logout(): 5 print("退出") 6 def manager(): 7 print("管理") 8 9 10 在py2.py中调用py1.py 11 import py1 12 def run(): 13 choice=input("输出你的选择:") #通过不同的输入请求,来调用不同模块 14 if choice=="login": 15 py1.login() 16 elif choice=="logout": 17 py1.logout() 18 elif choice=="manager": 19 py1.manager() 20 else: 21 print(404) 22 if __name__ == "__main__": 23 run()import py1 24 缺点:这要需要重复写很多if elif else
使用反射来改进代码: py2.py import py1 def run(): choice=input("输出你的选择:") func=getattr(py1,choice) #匹配py1模块中的choice函数 func() if __name__ == "__main__": run() 或者 py2.py import py1 def run(): choice=input("输出你的选择:") if hasattr(py1,choice): #判断py1中是否有choice函数,有点话执行 func=getattr(py1,choice) func() if __name__ == "__main__": run()
前面我们可以通过字符串来匹配函数,那么当模块比较多的时候如果我们手动import会增加代码量,我们是否可以通过字符串来匹配我们想要的模块,这样会更智能一点!
1 这里有三个模块,login.py manage.py logout.py 2 login.py 3 def log(): 4 print("登录") 5 manage.py 6 def order(): 7 print("管理") 8 logout.py 9 def off(): 10 print("退出") 11 然后我们通过字符串来匹配我们想要的模块,和模块中的函数 12 #首先过字符串来匹配模块的名称,然后再通过字符串来匹配模块中的函数 13 def run(): 14 inp=input("输入:") #通过用户的输入的字符串来匹配 15 m, f = inp.split('/') #用/来分割我们输入的字符串,斜杠前面赋值给m,后面的赋值给f 16 obj = __import__(m) #通过字符串m来匹配模块,并且导入。把导入的模块取名为obj 17 if hasattr(obj,f): #判断模块obj中是否有方法f 18 func = getattr(obj,f) #获取obj中的方法f,命名为函数func 19 func() #执行函数func() 20 else: 21 print(404) #如果没有方法,则输出404 22 run() 23 执行: 24 输入:login/log 25 登录
1 如果模块不在当前的路径怎么办,这时我们导入模块就需要带上路径。 2 obj = __import__("pk1." + "account",fromlist=True) #account模块在目录pk1下 3 obj.login() #调用函数 4 5 同样我们多加几个目录: 6 def run(): 7 inp=input("输入:") 8 m, f = inp.split('/') 9 obj = __import__("pk.pk1." + m,fromlist=True) 10 if hasattr(obj,f): 11 func = getattr(obj,f) 12 func() 13 else: 14 print(404) 15 run()

浙公网安备 33010602011771号