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)
View Code

注:

#设置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")
posted @ 2016-06-14 11:38  jl_bai  阅读(117)  评论(0)    收藏  举报

收藏

返回顶部