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 相关文章推荐
Django1.7+python 2.78+pycharm配置mysql数据库教程
Nov 18 Python
Python标准库之多进程(multiprocessing包)介绍
Nov 25 Python
举例详解Python中threading模块的几个常用方法
Jun 18 Python
Pycharm学习教程(1) 定制外观
May 02 Python
微信跳一跳python代码实现
Jan 05 Python
python 批量解压压缩文件的实例代码
Jun 27 Python
python并发编程多进程 模拟抢票实现过程
Aug 20 Python
Python3直接爬取图片URL并保存示例
Dec 18 Python
python3 字符串知识点学习笔记
Feb 08 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
Dec 07 Python
python 使用OpenCV进行简单的人像分割与合成
Feb 02 Python
怎么用Python识别手势数字
Jun 07 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
不用数据库的多用户文件自由上传投票系统(1)
2006/10/09 PHP
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
php 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
ThinkPHP缓存方法S()概述
2014/06/13 PHP
php实现可逆加密的方法
2015/08/11 PHP
详解PHP执行定时任务的实现思路
2015/12/21 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
2020/03/16 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
JavaScript的类型转换(字符转数字 数字转字符)
2010/08/30 Javascript
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
2011/09/02 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
javascript间隔刷新的简单实例
2013/11/14 Javascript
对table和ul实现js分页示例分享
2014/02/24 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
2015/03/02 Javascript
基于jquery实现的自动补全功能
2015/03/12 Javascript
JQuery跳出each循环的方法
2015/04/16 Javascript
JS常见问题之为什么点击弹出的i总是最后一个
2016/01/05 Javascript
使用pcs api往免费的百度网盘上传下载文件的方法
2016/03/17 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
2016/10/04 Javascript
微信小程序使用canvas自适应屏幕画海报并保存图片功能
2019/07/25 Javascript
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
Python实现修改IE注册表功能示例
2018/05/10 Python
对python当中不在本路径的py文件的引用详解
2018/12/15 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
css3截图_动力节点Java学院整理
2017/07/11 HTML / CSS
CSS3实现3D翻书效果
2016/06/20 HTML / CSS
外国语学院毕业生自荐信
2013/10/28 职场文书
演讲稿开场白
2014/01/13 职场文书
2014年党员创先争优承诺书
2014/05/29 职场文书
毕业生个人自荐书
2015/03/05 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书
python中的3种定义类方法
2021/11/27 Python
Ruby处理YAML和json数据
2022/04/18 Ruby