#!/usr/bin/env python # -*- coding: utf-8 -*- ''' 反射:利用字符串去对象中操作成员 ''' ''' 案例: 根据字符串到模块中执行模块中函数名与字符串一致的函数(以字符串的形式执行函数) #下面所有操作都是基于内存的,setattr、delattr不会对对象造成影响 hasattr() 判断对象中是否存在成员 getattr() 从对象中查找成员 setattr() 在对象中设置(添加)成员 delattr() 从对象中删除成员 import commons def run(): s = input("请输入要执行的函数名:") #if s == 'login': # commons.login() #elif s == 'logout': # commons.logout() #elif s == 'home': # commons.home() #else: # print('404') #如果要手动进行判断输入的字符串对应的模块中的函数名,要写很长。要想很简单的就找到函数,可以用反射 if hasattr(commons,s): #判断commons模块中是否存在函数名与字符串s一致的函数,有则返回True func = getattr(commons,s) #从commons模块中查找函数名与字符串s一致的函数 func() #执行函数 else: print('404') if __name__ == '__main__': run() ''' ''' 案例2: 以字符串的形式导入模块 __import__() #导入模块,括号内是字符串 =====》也可以使用importlib模块 注意: 如果是导入其他目录下的模块,如:__import__('lib.commons'),默认情况下只会导入lib,而不是导入commons,要想导入完整, 需要添加参数:__import__('lib.commons',fromlist=True),这样就可以导入完整 ''' def run(): s = input('请输入url:') #commons/login形式 m,f = s.split('/') obj = __import__(m) if hasattr(obj,f): func = getattr(obj,f) func() else: print(404) if __name__ == '__main__': run()