反射

 1.反射 是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!
根据字符串的形式取对象(某个模块)操作成员
 
 
2通过字符串导入模块
a = __import__("模块名")
a = __import__('lib.test.com', fromlist=True)
通过字符串的形式,去模块中寻找指定的函数, 并执行
		a = __import__("模块名")  用于以字符串的形式导入模块
		a = __import__('lib.test.com', fromlist=True) 导入嵌套几层的文件中的模块 
inp = input('请输入模块:')
print(inp,type(inp))   查看模块的类型
xin = __import__(inp)  用于字符串形式导入模块

ss = xin.f1()          执行指定的函数
print(ss) 
cc = xin.f2()
print(cc)
dd = xin.f3()
print(dd)

python中的反射功能是由以下四个内置函数提供:

getattr。 用于以字符串的形式去某个模块中寻找函数 在获取到的函数名后加() 表示执行函数

hasattr、根据字符串的形式去某个模块中判断东西是否存在

setattr、根据字符串的形式去某个模块中设置内容

delattr,根据字符串的形式去某个模块中删除某个内容

简单查看的方式:

class Foo(object):
 
    def __init__(self):
        self.name = 'yigeyagng'
 
    def func(self):
        return 'func'
 
obj = Foo()
 
# #### 检查是否含有成员 ####
hasattr(obj, 'name')
hasattr(obj, 'func')
 
# #### 获取成员 ####
getattr(obj, 'name')
getattr(obj, 'func')
 
# #### 设置成员 ####
setattr(obj, 'age', 18)
setattr(obj, 'show', lambda num: num + 1)
 
# #### 删除成员 ####
delattr(obj, 'name')
delattr(obj, 'func')

另外一种方式:

inp = input('请输入模块:')
inp_func = input('请输入执行的函数:')
xx = __import__(inp)               #通过以字符串的形式寻找模块
get = getattr(xx,inp_func)        #用于以字符串的形式去某个模块中寻找函数 重新赋值
ss = get()                        #将get加上()就是执行函数
print(ss)

import fan                          #导入模块
#
cc = hasattr(fan,'XXX')             #去模块中判断是否存在
print(cc)

fan.f1()                            #执行模块中的 f1 函数
setattr(fan,'ZZZ',lambda a:a + 1)   #去某个模块中设置内容
zz = hasattr(fan,'ZZZ')             #之后再查看一下内容
print(zz)

delattr(fan,'XXX')                  #模块中删除某个内容
vv = hasattr(fan,'XXX')             #查看之后的内容
print(vv)

3,实例:基于反射实现类Web框架的路由系统

#############三种实现方式##########
from xxx import count
#复杂写法
url = input('请输入url:')  #等待用户输入的模块名
if url.endswith('login'):  #判断输入的是不是login结束的
    r = count.login()      #执行count模块的login函数
    print(r)
elif url.endswith('logout:'): 
    r = count.logout
    print(r)
elif url.endswith('lognb:'):
    r = count.lognb
    print(r)
else:                           否则都不是
    print('404')                就输入404
#优化写法
url = input('请输入url:')
inp = url.split('/')[-1]
if hasattr(count,inp):
    sss = getattr(count,inp)
    r = sss()
    print(r)
else:
    print('404')
#再进一步优化
inp = input('请输入url:')
sss,get = inp.split('/')
m = __import__('xxx.'+sss,fromlist=True)
if hasattr(m,get):
    get = getattr(m,get)
    r = get()
    print(r)
else:
    print('404')
原文地址:https://www.cnblogs.com/guokaixin/p/5547372.html