Python 反射
1.通过字符串来导入模块
# import hashlib as hs hs = __import__('hashlib') o = hs.md5() o.update(bytes('admin',encoding='utf-8')) print(o.hexdigest()) #21232f297a57a5a743894a0e4a801fc3
2.通过字符串寻找函数
hs = __import__('hashlib') # 以字符串的形式导入模块 md55 = getattr(hs,'md5') #以字符串的形式在模块中寻找函数 o = md55() # 这里不能hs.md55() ,在hs 模块中是没有md55这个函数的 o.update(bytes('admin',encoding='utf-8')) print(o.hexdigest()) #21232f297a57a5a743894a0e4a801fc3
3.反射:根据字符串的形式去对象中操作其成员
#!/usr/bin/env python # --*-- encoding:utf-8 --*-- """ s1.py的内容 NAME = 'abc' def func(): print('func') """ import s1 #判断是否存在 res = hasattr(s1,'NAME') #判断是否有这个变量 print(res) # True 存在返回True,不存在返回False res = hasattr(s1,'func') print(res) # True #获取属性 res = getattr(s1,'NAME',None) #获取变量,不存在返回空 print(res) #abc f = getattr(s1,'func',None) #获取函数不存在,返回None f() #设置属性 setattr(s1,'AGE',18) #设置变量,均在内存中操作,对原文件无影响 res = getattr(s1,'AGE',None) print(res) # 18 setattr(s1,'func1',lambda x:x+1) #设置函数 f = getattr(s1,'func1',None) print(f(3)) # 4 #删除属性 delattr(s1,'NAME') #删除变量 res = getattr(s1,'NAME',None) print(res) # None delattr(s1,'func') #删除函数 f = getattr(s1,'func',None) print(f) # None
5.__import__扩展
import lib.bin.abc from lib.bin import abc as dd dd = __import__('lib.bin.abc',fromlist=True)
6.web框架的思路
- 获取路径path = 'account\login'
- 进行分割 target_module,target_func = path.split('\')
- 导入模块 mod = __import__('lib.'+target_module,fromlist=True)
- 判断是否有这个函数 if hasattr('mod',target_func):
- 调用这个函数 func = getattr('mod',target_func)
- func()

浙公网安备 33010602011771号