【Python之路】特别篇--Python反射 反射 基于反射实现类Web框架的路由系统

说反射之前先介绍一下__import__方法,这个和import导入模块的另一种方式

1.  import commons
2.  __import__('commons')

如果是多层导入:

1. from list.text import commons 
2. __import__(' list.text.commons',fromlist=True) #如果不加上fromlist=True,只会导入list目录

实例:

# lib  - commons.py

NAME = 'Maria'
def f1():
    return "F1"

def f2():
    return "F2"

def f3():
    return "F3"


****************************
# index.py

moudle = __import__('lib.commons',fromlist=True)

ret = moudle.f1()
print(ret)
# F1

  反射即想到4个内置函数分别为:getattr、hasattr、setattr、delattr  获取成员、检查成员、设置成员、删除成员下面逐一介绍先看例子:

moudle = __import__('lib.commons',fromlist=True)

# 获取成员
ret = getattr(moudle,'f1',None)    # 可以设置默认值,没找到时 ret = None
print(ret)
# <function f1 at 0x00000090548CF2F0>

# 获取全局变量:
ret = getattr(dd,"NAME",None)

# 检查成员
ret = hasattr(moudle,'f11')     # 因为有f1方法所以返回True
print(ret)

# 设置成员
setattr(moudle,"AGE",18)	     # 内存中创建了一个全局变量
ret = getattr(moudle,'AGE',None)
print(ret)

setattr(moudle,"ADD",lambda a: a +1 )    # 内存中创建了一个函数
ret = getattr(moudle,'ADD',None)
print(ret(100))

# 删除成员
delattr(moudle,'f3')
ret = hasattr(moudle,'f3')
print(ret)

对于反射小节:

反射:
# 根据字符串的形式去某个模块中寻找东西
# 根据字符串的形式去某个模块中判断东西是否存在
# 根据字符串的形式去某个模块中设置东西
# 根据字符串的形式去某个模块中删除东西
# 根据字符串的形式去对象 (某个模块) 中操作成员

结论:
1.根据字符串的形式导入模块。
2.根据字符串的形式去对象(某个模块)中操作其成员 

基于反射实现类Web框架的路由系统

实现思路:规定用户输入格式 模块名/函数名 通过__import__的形式导入模块并通过 hasattr和getattr 检查并获取函数返回值。

# lib - commons.py
def login():
    return 'login'

def logout():
    return 'logout'

********************************
# index.py


target_url = input('请输入url:')
target_module,target_func =target_url.split('/')

moudle = __import__('lib.'+target_module,fromlist=True)

if hasattr(moudle,target_func) == True:
    func = getattr(moudle,target_func)
    ret = func()
    print(ret)
else :
    print('404 Not Found!')