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 相关文章推荐
python中元类用法实例
Oct 10 Python
Python中的index()方法使用教程
May 18 Python
python 读取摄像头数据并保存的实例
Aug 03 Python
python之Flask实现简单登录功能的示例代码
Dec 24 Python
钉钉群自定义机器人消息Python封装的实例
Feb 20 Python
用python做游戏的细节详解
Jun 25 Python
Python倒排索引之查找包含某主题或单词的文件
Nov 13 Python
Python+numpy实现矩阵的行列扩展方式
Nov 29 Python
Python Lambda函数使用总结详解
Dec 11 Python
python中有关时间日期格式转换问题
Dec 25 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
Jan 20 Python
Python标准库之typing的用法(类型标注)
Jun 02 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调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
php中OR与|| AND与&&的区别总结
2013/10/26 PHP
php遍历目录方法小结
2015/03/10 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
JavaScript 模拟用户单击事件
2009/12/31 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
2013/01/09 Javascript
浅谈 javascript 事件处理
2015/01/04 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
Jquery中map函数的用法
2016/06/03 Javascript
基于jquery实现弹幕效果
2016/09/29 Javascript
JS计算距当前时间的时间差实例
2017/12/29 Javascript
iview table render集成switch开关的实例
2018/03/14 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
2019/02/02 Javascript
vue绑定class的三种方法
2020/12/24 Vue.js
[01:09:40]Newbee vs Pain 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python之wxPython菜单使用详解
2014/09/28 Python
python如何实现反向迭代
2018/03/20 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
python dumps和loads区别详解
2020/02/04 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
Python自动化操作实现图例绘制
2020/07/09 Python
Django中使用Celery的方法步骤
2020/12/07 Python
html5模拟平抛运动(模拟小球平抛运动过程)
2013/07/25 HTML / CSS
《鲁班和橹板》教学反思
2014/04/27 职场文书
人力资源管理系自荐信
2014/05/31 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
刑事附带民事诉讼答辩状
2015/05/22 职场文书
百年孤独读书笔记
2015/06/29 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书