python 反射
一.简介
反射是通过字符串的形式操作对象相关的成员
反射也就是:通过字符串的形式,导入模块。通过字符串的形式,去模块中寻找指定函数,并执行。Python中的反射功能是由以下四个内置函数提供:
hasattr(模块,"成员"):根据字符串的形式去某个模块中检查是否含有某成员
getattr(模块,"成员"):根据字符串的形式去某个模块中获取成员
setattr(模块,"成员"):根据字符串的形式去某个模块中设置成员
delattr(模块,"成员"):根据字符串的形式去某个模块中删除成员
import moudule #查看属性是否存在,如果有返回True否则返回False # result = hasattr(moudule,"fun") # print(result) #设置添加对象 result = hasattr(moudule,"fun2") print(result) r = setattr(moudule,"fun2",lambda a:a+2) result = hasattr(moudule,"fun2") print(result) #删除对象 r = delattr(moudule,"fun2") result = hasattr(moudule,"fun2") print(result)
根据字符串形式去模块中寻找函数并且执行函数
inp_name = input("请输入模块:") inp_func = input("请输入要执行的函数:") #导入输入的模块 inp = __import__(inp_name) #获取模块中的函数名 target_func = getattr(inp,inp_func) #执行函数 ret = target_func() print(ret) #打印结果: 请输入模块:commons 请输入要执行的函数f1 f1 F1
# 查看是否存在,不存在False,存在True r = hasattr(commons,"NAME") print(r) # 设置成员 r = setattr(commons,"ARG",lambda a: a + 1) print(r) # 删除成员 delattr(commons,"NAME") #查看已删除成员是否还存在 r = hasattr(commons,"NAME") print(r)
注:
#设置None:如果找到成员f1,就会执行;如果没有找到,就会报错 target_func = getattr(commons,"Name",None) ret = target_func() print(ret)
扩展两种导入模块的方式:
a = __import__("模块名") #fromlist = True递归导入 a = __import__("文件名.文件名.模块名",fromlist=True)
例
#模块名/函数名 url = input("请输入url:") #模块名和函数名的格式 target_module,target_func = url.split("/") #导入用户输入的模块 m = __import__("lib."+target_module,fromlist=True) if hasattr(m,target_func): target_func = getattr(m,target_func) r = target_func() print(r) else: print("404")

浙公网安备 33010602011771号