一.反射简介
反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动。
二.反射实例说明
关于反射,主要用到的是四个内置函数:
getattr()
hasattr()
setattr()
delattr()
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#直接通过文件名导入模块reflect
import reflect
ret=reflect.f1()
print(ret,type(ret))
#反射用到的内置函数:
#getattr 以字符串的形式去寻找对象(包括模块)中的对象属性(包括模块中的函数)
#hasattr 以字符串的形式判断对象(包括模块)中的对象属性(包括模块中的函数)是否存在
#seteattr以字符串的形式设置对象(包括模块)的对象属性
#delattr以字符串的形式删除对象中的对象属性
#通过字符串的形式让用户输入模块名,然后导入输入的模块
inp=input("请输入模块名:") #用户输入的是字符串
# print(inp,type(inp))
md=__import__(inp) #_import_以字符串形式导入模块名
#模块中寻找函数并执行函数
# r=md.f1()
# print(r)
func_inp=input("请输入要执行的函数:")
#getattr 以字符串的形式去寻找对象(包括模块)中的对象属性(包括模块中的函数)
t_func=getattr(md,func_inp)
#执行函数
result=t_func()
print(result)
#hasattr 以字符串的形式判断某个对象属性(包括函数及其他对象属性)是否存在,返回false表示不存在,true表示存在
print(hasattr(reflect,"f5"))
#setattr 以字符串的形式设置对象(包括模块)的对象属性(包括函数及其他对象属性)
setattr(reflect,"NAME","Kobe")
print(hasattr(reflect,"NAME"))
#delattr以字符串的形式删除对象(包括模块)中的对象属性(包括函数及其他对象属性)
delattr(reflect,"f4")
print(hasattr(reflect,"f4"))
注:以上这些对对象属性的操作都是在内存中进行,不会去修改对象里的内容
三.基于反射机制模拟web框架路由
需求:我们想通过用户输入的模块名和函数名返回对应的值
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#import account
url=input("请输入url:")
target_module,target_func=url.split("/")
#动态导入模块,并执行函数
m=__import__("lib."+target_module,fromlist=True)
if hasattr(m,target_func):
target_account=getattr(m,target_func)
r=target_account()
print(r)
# if url.endswith("login"):
# r=account.login()
# print(r)
# elif url.endswith("logout"):
# r = account.logout()
# print(r)
# elif url.endswith("kobe"):
# r = account.kobe()
# print(r)
else:
print("404")
View Code