一、反射
getattr # 根据字符串的形式,去对象中找成员。
hasattr # 根据字符串的形式,去判断对象中是否有成员。
setattr # 根据字符串的形式,动态的设置一个成员(内存)
delattr # 根据字符串的形式,动态的删除一个成员(内存)
说反射之前先介绍一下__import__方法,这个和import导入模块的另一种方式
1. import commons 2. __import__('commons')
如果是多层导入:
1. from list.text import commons 2. __import__(' list.text.commons',fromlist=True) #如果不加上fromlist=True,只会导入list目录
反射即想到4个内置函数分别为:getattr、hasattr、setattr、delattr 获取成员、检查成员、设置成员、删除成员下面逐一介绍先看例子
class Foo(object): def __init__(self): self.name = 'abc' def func(self): return 'ok' obj = Foo() #类+()获取的是对象 #获取成员 ret = getattr(obj, 'func')#获取的是个对象 r = ret() print(r) #检查成员 ret = hasattr(obj,'func')#因为有func方法所以返回True print(ret) #设置成员 print(obj.name) #设置之前为:abc ret = setattr(obj,'name',19) print(obj.name) #设置之后为:19 #删除成员 print(obj.name) #abc delattr(obj,'name') print(obj.name) #报错
对于反射小节:
1.根据字符串的形式导入模块。 2.根据字符串的形式去对象(某个模块)中操作其成员
-----------------------------------------------------------------------
上述例子的ret,
类() #获取的是对象 ret=gatter(类(),"方法名")
ret=类(模块,对象).方法(变量--字符串形式),第一个参数给第二个方法,类.方法执行的时函数手动传参,对象.方法执行的是方法,自动传参
如果手动传参,传的是类的对象名
-------------------------------------------------------
实例:基于反射实现类Web框架的路由系统
实现思路:规定用户输入格式 模块名/函数名 通过__import__的形式导入模块并通过 hasattr和getattr 检查并获取函数返回值。
https://images2015.cnblogs.com/blog/938899/201606/938899-20160602211241555-863340730.gif