Python反射

一.反射:


1.通过字符串的形式导入模块

2.通过字符串的形式去模块中寻找指定函数,并执行

3.反射:

a.根据字符串的形式去某个模块中寻找东西, 函数:__import__, getattr

b.根据字符串的形式去某个模块中判断东西是否存在,  函数:hasattr

c.根据字符串的形式去某个模块中设置东西,  函数:setattr

d.根据字符串的形式去某个模块中删除东西,  函数:delattr

总结:反射是根据字符串形式去对象(某个模块)中操作其成员,一切事物皆对象!

#应用:根据用户输入的内容导入模块
inp = input('请输入模块名:')
inp_func = input('请输入要执行的函数:')
#__import__()用于以字符串的形式导入模块
dd = __import__(inp)#相当于import commons as dd
target_func = getattr(dd,inp_func)#getattr用于以字符串的形式去某个模块中找函数
result = target_func()#获取到的函数后加()表示执行函数
print(result)
import commons
target_func = getattr(commons, 'name',None)#None:没有name这个全局变量报空
print(target_func)
# target_func()#如果是函数就执行

r = hasattr(commons, 'name')#判断没有的话返回False
print(r)

setattr(commons,'AGE',18)#设置全局变量
setattr(commons,'AGE',lambda a: a + 1)#设置内存里面函数,跟原文件没关系
r = hasattr(commons,'AGE')
print(r)

delattr(commons,'AGE')#删除内存里面的数据
r = hasattr(commons,'AGE')
print(r)
a = __import__('lib.test.com',fromlist=True)#导入lib模块下面的test模块下面的com模块,必须带fromlist否则只能找到lib.
等同于:from lib.test import com

 基于反射实现web框架的路由系统:

#根据输入url地址查找页面(根据后缀来找到页面),这种有多少url就要写多少判断
from lib import acccount

url = input('请输入url:')
if url.endswith('login'):
    r = acccount.login()
    print(r)
elif url.endswith('logout'):
    r = acccount.login()
    print(r)
else:
    print('404')


#再定义lib文件夹下面的acccount模块
def login():
    return 'login'

def logout():
    return 'logout'
#根据输入url地址查找页面(根据后缀来找到页面),这种用反射取的值判断只写一次就行
from lib import acccount

url = input('请输入url:')
inp = url.split('/')[-1]#分割取用户输入的最后一个
if hasattr(acccount,inp):
    target_func = getattr(acccount,inp)
    r = target_func()
    print(r)
else:
    print('404')

#再定义lib文件夹下面的acccount模块
def login():
    return 'login'

def logout():
    return 'logout'
#根据模块名/函数名查找url(可以在多个模块里面找到url)终极版
url = input('请输入url:')
targe_module, target_func = url.split('/')#模块名和函数名的格式
m = __import__('lib.' + targe_module, fromlist=True)#导入用户输入的模块
if hasattr(m, target_func):
    target_func = getattr(m,target_func)
    r = target_func()
    print(r)
else:
    print('404')
原文地址:https://www.cnblogs.com/zcok168/p/9147215.html