反射的使用

反射的作用:通过字符串去匹配对象中的成员(成员一般指模块中的函数)。

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

 

posted @ 2016-10-27 22:42  hehe88  阅读(84)  评论(0)    收藏  举报