反射
1.自定义模块
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 NAME = 'alex' 2 3 def f1(): 4 return "f1执行成功" 5 6 7 def f2(): 8 return "F2" 9 10 11 def f3(): 12 return "F3"
2.__import__():通过字符串的形式导入模块
例子1:
1 inp = input("请输入模块:") 2 print(inp, type(inp)) 3 dd = __import__(inp) 4 print(dd.f1()) 5 6 #请输入模块:commons 7 #commons <class 'str'> 8 #f1执行成功
例子2:
1 #导入模块 2 import test.com 3 4 from test import com 5 6 r = __import__('test.com') 7 8 print(r) 9 # <module 'test' from 'D:\untitled\反射\test\__init__.py'> 10 11 r = __import__('test.com', fromlist=True) 12 13 print(r) 14 # <module 'test.com' from 'D:\untitled\反射\test\com.py'>
3.反射:根据字符串的形式去某个对象(模块)中寻找东西
例1:
1 import commons 2 target_func = getattr(commons, 'f1') 3 print(target_func()) 4 5 #f1执行成功
例2:
1 dd = __import__('commons') 2 3 # getattr() 通过字符串的形式,去模块中寻找指定函数,并执行 4 inp_func = input("请输入要执行的函数:") 5 # target_func 和 模块中名为inp_func的函数 指向的同一块内存 6 target_func = getattr(dd, inp_func) 7 result = target_func() 8 print(result) 9 10 #请输入要执行的函数:f1 11 #f1执行成功
4.反射的所有功能
反射: 根据字符串的形式对象(某个模块)中操作其成员
getattr():根据字符串的形式去某个对象(包括模块)获取它的成员根据字符串的
hasattr():判断去某个对象(包括模块)中判断东西是否存在
setattr():根据字符串的形式去某个对象(包括模块)中设置东西
delattr():根据字符串的形式去某个对象(包括模块)中删除东西
1 #反射:根据字符串的形式去某个模块中寻找东西 2 3 target_func = getattr(commons,"NAME",None) 4 print(target_func) 5 target_func() #找到函数加()就执行函数 6 7 #根据字符串的形式去某个模块中判断东西是否存在 8 r = hasattr(commons,"NAME") 9 print(r) 10 11 根据字符串的形式去某个模块中设置东西(不改变模块,只是内存) 12 setattr(commons,"AGE",18) 13 14 #根据字符串的形式去某个模块中删除东西(不改变模块,只是内存) 15 delattr(commons,'NAME') 16 r = hasattr(commons,"NAME") 17 print(r)
5.web框架路由系统
内部调用模块
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def login(): 2 return 'LOGIN' 3 4 5 def logout(): 6 return 'LOGOUT' 7 8 def nb(): 9 return '非常牛b的功能'
5.1传统方法
# !/usr/bin env python # -*- coding:utf-8 -*- from lib import account url = input('请输入url:') # 当url非常多得时候,那么就要写100个if else if url.endswith('login'): r = account.login() print(r) elif url.endswith('logout'): r = account.login() print(r) elif url.endswith('nb'): r = account.nb() print(r) else: print('404') #请输入url:www.wuwen666.com/login #LOGIN
5.2基于反射
# !/usr/bin env python # -*- coding:utf-8 -*- from lib import account url = input('请输入url:') # 基于反射 inp = url.split('/')[-1] if hasattr(account, inp): func = getattr(account, inp) r = func() print(r) else: print('404') #请输入url:www.wuwenhennb.com/login #LOGIN
5.3基于反射(改进)类似于Django等web框架
# 以上的例子中,只有一个模块存放了可以调用的函数 # 当大量函数分布在不同的模块中的时候,我们需要针对性的导入模块 # 我们可以输入模块名和函数名,利用反射导入模块,再利用反射找到函数 # 模块名/函数名 url = input('请输入url:') # 基于反射 target_module, target_func = url.split('/') # 导入模块 m = __import__('lib.'+ target_module, fromlist=True) # 找到函数 if hasattr(m, target_func): func = getattr(m, target_func) r = func() print(r) else: print('404') #请输入url:account/login #LOGIN