一.反射简介

反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动。

 

二.反射实例说明

 

关于反射,主要用到的是四个内置函数:

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框架路由
需求:我们想通过用户输入的模块名和函数名返回对应的值

怎么在python里用react python reflect_怎么在python里用react

怎么在python里用react python reflect_内置函数_02

#!/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