反射:利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员,主要用于伪造web框架中的路由系统
1 #我们首先定义一个common模块用于存储url调用模块中的对应的函数 2 def login(): 3 print('login') 4 5 def home(): 6 print('home') 7 8 #主模块中 9 #调用common模块 10 import common 11 12 def run(): 13 inp =input('输入要访问的页面!') 14 #inp字符串类型inp='login' 15 #commons inp()#commons.login 16 #利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员 17 if hasattr(common,inp): 18 #getattr根据第一个模块参数去调用第二个字符串参数 19 func=getattr(common,inp) 20 func() 21 else: 22 print('404') 23 24 run() 25 #运行 26 >>>输入要访问的页面!login 27 >>>login第二种方式:
1 #common模块定义url 2 def login(): 3 print('login') 4 5 def home(): 6 print('home') 7 8 9 #利用vars函数将字符串转换成变量的形式进行调用 10 import common 11 def run(): 12 inp =input('输入要访问的页面!') 13 if hasattr(common,inp): 14 func=vars(common)[inp] 15 func() 16 else: 17 print('404') 18 19 20 21 if __name__ == '__main__': 22 run() 23 24 >>>输入要访问的页面!login 25 >>>login 1 #多层url的调用:不同模块中存在不同的url调用函数的情况下 2 #模块mommon 3 def login(): 4 print('login') 5 6 def home(): 7 print('home') 8 9 #模块mommon2 10 11 def f1(): 12 print('f1') 13 14 def f2(): 15 print('f2') 16 17 #主函数 18 inp = input('输入要访问的页面!') 19 e, f = inp.split('/') 20 21 #__import__内置方法用于将输入字符串转化为对应模块进行调用 22 obj = __import__(e) 23 if hasattr(obj,f): 24 func = getattr(obj,f) 25 func() 26 else: 27 print("404") 28 29 >>>输入要访问的页面!common/login 30 >>>login 31 >>>输入要访问的页面!common2/f1 32 >>>f1
转载于:https://www.cnblogs.com/liguangxu/p/5578729.html