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()

  

posted @ 2017-04-29 15:43  1916  阅读(127)  评论(0)    收藏  举报