python通过实例讲解反射机制


Posted in Python onOctober 17, 2019

一、反射机制简介:

  • 通过字符串的形式导入模块
  • 通过字符串的形式,去模块中寻找指定的函数,并执行
  • 规定用户输入格式 模块名/函数名 通过__import__的形式导入模块,并通过 hasattr和getattr 检查并获取函数返回值。

相关方法:

  • getattr:--根据字符串的形式去某个模块中寻找东西
  • hasattr:--根据字符串的形式去某个模块中判断东西是否存在
  • setattr:--根据字符串的形式去某个模块中设置东西
  • delattr:--根据字符串的形式去某个模块中删除东西

二、反射机制初识:

test.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

def f1():
return '我是F1,我被调用了'

def f2():
return '我是F2,我被调用了'

def f3():
return '我是F3,我被调用了'

index.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
反射机制
1.根据字符串的形式导入模块。
2.根据字符串的形式去对象(某个模块)中操作其成员 
实现思路:规定用户输入格式 模块名/函数名 通过__import__的形式导入模块,并通过 hasattr和getattr 检查并获取函数返回值。
"""
#通过用户输入的形式, 导入模块
inp = input('请输入需要导入的模块名:')
#__import__用于以字符串的形式导入模块
dd = __import__(inp)
#在模块寻找函数并执行函数
inp_func = input('请输入需要执行的函数:')
#getattr()用于以字符串的形式去某个模块中寻找函数
tager_func = getattr(dd, inp_func)
#在获取到的函数名后加()表示执行函数
result = tager_func()
print(result)

代码执行结果:

请输入需要导入的模块名:test
请输入需要执行的函数:f2
我是F2,我被调用了

实例:基于反射模拟Web框架路由系统(一)

commons.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

def login():
return 'login'

def logout():
return 'logout'

def nb():
return '很牛逼的网页'

refec_demo.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
基于反射模拟web框架路由系统
"""
from lib import commons
url = input('请输入模拟的url路径:')
if url.endswith('login'):
ret = commons.login()
print(ret)
elif url.endswith('logout'):
ret = commons.logout()
print(ret)
else:
print('404')

实例:基于反射模拟Web框架路由系统(二)

refec_demo1.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from lib import commons

inp = input('请输入模拟的url路径:')
url_inp = inp.split('/')[-1]
if hasattr(commons, url_inp):
ret = getattr(commons, url_inp)
result = ret()
print(result)
else:
print('404')

代码实现结果:

路径正确时结果:

python通过实例讲解反射机制

路径不正确时结果:

python通过实例讲解反射机制

实例:基于反射模拟Web框架路由系统(三)

manager.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

def home():
return 'Home'

order.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
def add_order():
return '添加订单'

refec_demo2.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

#用户输入规则:模块名/函数名

url = input('请输入模块名/函数名:')
target_modul, target_func = url.split('/')
#__import__导入模块
mod = __import__('lib.' + target_modul, fromlist=True)
#hasattr()判断函数是否存在
if hasattr(mod, target_func):
ret = getattr(mod, target_func)
result = ret()
print(result)
else:
print('404')

当模块和函数都存在时,url路径调用结果:

python通过实例讲解反射机制

当模块和函数都不存在时,url路径调用结果:

python通过实例讲解反射机制

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Windows下PyMongo下载及安装教程
Apr 27 Python
使用py2exe在Windows下将Python程序转为exe文件
Mar 04 Python
python3大文件解压和基本操作
Dec 15 Python
pyQT5 实现窗体之间传值的示例
Jun 20 Python
Django Admin中增加导出CSV功能过程解析
Sep 04 Python
TensorFlow实现保存训练模型为pd文件并恢复
Feb 06 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
Feb 26 Python
Python操作MongoDb数据库流程详解
Mar 05 Python
解决reload(sys)后print失效的问题
Apr 25 Python
使用openCV去除文字中乱入的线条实例
Jun 02 Python
python怎么对数字进行过滤
Jul 05 Python
详解Django中 render() 函数的使用方法
Apr 22 Python
python集合常见运算案例解析
Oct 17 #Python
Pandas聚合运算和分组运算的实现示例
Oct 17 #Python
18个Python脚本可加速你的编码速度(提示和技巧)
Oct 17 #Python
python numpy中cumsum的用法详解
Oct 17 #Python
python hashlib加密实现代码
Oct 17 #Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 #Python
python模块常用用法实例详解
Oct 17 #Python
You might like
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
Yii调试SQL的常用方法
2014/07/09 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
2019/04/11 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
两个Javascript小tip资料
2010/11/23 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
2014/04/02 Javascript
js实现下拉框选择要显示图片的方法
2015/02/16 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
AngularJS 实现按需异步加载实例代码
2015/10/18 Javascript
Bootstrap表单简单实现代码
2017/03/06 Javascript
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
JavaScript实现随机点名小程序
2020/10/29 Javascript
[03:34]2014DOTA2西雅图国际邀请赛 淘汰赛7月15日TOPPLAY
2014/07/15 DOTA
[49:08]Secret vs VP 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
2017/11/16 Python
python中format()函数的简单使用教程
2018/03/14 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
2019/06/03 Python
如何使用canvas绘制可移动网格的示例代码
2020/12/14 HTML / CSS
物流管理应届生求职信
2013/11/07 职场文书
社区两委对照检查材料
2014/08/23 职场文书
金融专业银行实习证明模板
2014/11/28 职场文书
公司股份转让协议书范本
2015/01/28 职场文书
军训结束新闻稿
2015/07/17 职场文书
初中物理教学反思
2016/02/19 职场文书
python Polars库的使用简介
2021/04/21 Python
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
2021/06/15 Javascript
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android