浅谈使用Python内置函数getattr实现分发模式


Posted in Python onJanuary 22, 2018

本文研究的主要是使用Python内置函数getattr实现分发模式的相关问题,具体介绍如下。

getattr 常见的使用模式是作为一个分发者。举个例子,如果你有一个程序可以以不同的格式输出数据,你可以为每种输出格式定义各自的格式输出函数,然后使用唯一的分发函数调用所需的格式输出函数。

例如,让我们假设有一个以 HTML、XML 和普通文本格式打印站点统计的程序。输出格式在命令行中指定,或者保存在配置文件中。statsout 模块定义了三个函数:output_htmloutput_xml output_text。然后主程序定义了唯一的输出函数,如下:

import statsout

def output(data, format="text"):               
  output_function = getattr(statsout, "output_%s" % format) 
  return output_function(data)

output 函数接收一个必备参数 data,和一个可选参数 format。如果没有指定 format 参数,其缺省值是 text 并完成普通文本输出函数的调用。

你可以连接 format 参数值和 "output_" 来创建一个函数名称作为参数值,然后从 statsout 模块中取得该函数。这种方式允许今后很容易的扩展程序以支持其它的输出格式,而且无需修改分发函数。所要做的仅仅是向 statsout 中添加一个函数,比如 output_pdf,之后只要将 “pdf” 作为 format 的参数值传递给 output 函数即可。

现在你可以简单的调用输出函数就像调用其它函数一样了。output_function 变量是指向 statsout 模块中相应函数的引用。

你是否发现前面示例的一个 Bug?即字符串和函数之间的松耦合,而且没有错误检查。如果用户传入一个格式参数,但是在 statsout 中没有定义相应的格式输出函数,会发生什么呢?还好,getattr 会返回 None,它会取代一个有效函数并被赋值给 output_function,然后下一行调用函数的语句将会失败并抛出一个异常。这种方式不好。值得庆幸的是,getattr 能够使用可选的第三个参数,一个缺省返回值。

总结

以上就是本文关于浅谈使用Python内置函数getattr实现分发模式的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
闭包在python中的应用之translate和maketrans用法详解
Aug 27 Python
Python编程实现双击更新所有已安装python模块的方法
Jun 05 Python
python的exec、eval使用分析
Dec 11 Python
python3 打开外部程序及关闭的示例
Nov 06 Python
python读写配置文件操作示例
Jul 03 Python
python使用协程实现并发操作的方法详解
Dec 27 Python
浅谈tensorflow中张量的提取值和赋值
Jan 19 Python
Python面向对象实现方法总结
Aug 12 Python
python3.8动态人脸识别的实现示例
Sep 21 Python
python实现一个简单RPC框架的示例
Oct 28 Python
python3爬虫中多线程进行解锁操作实例
Nov 25 Python
解决Python import .pyd 可能遇到路径的问题
Mar 04 Python
python正则表达式及使用正则表达式的例子
Jan 22 #Python
Python深度优先算法生成迷宫
Jan 22 #Python
Python使用Tkinter实现机器人走迷宫
Jan 22 #Python
Python实现简单文本字符串处理的方法
Jan 22 #Python
Python简单实现控制电脑的方法
Jan 22 #Python
Zookeeper接口kazoo实例解析
Jan 22 #Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 #Python
You might like
社区(php&&mysql)二
2006/10/09 PHP
php防注
2007/01/15 PHP
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
2011/07/03 PHP
PHP魔术引号所带来的安全问题分析
2014/07/15 PHP
PHP实现上传多图即时显示与即时删除的方法
2017/05/09 PHP
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
js倒计时小程序
2013/11/05 Javascript
JavaScript三元运算符的多种使用技巧
2015/04/16 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
详解jQuery停止动画——stop()方法的使用
2016/12/14 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
整理关于Bootstrap列表组的慕课笔记
2017/03/29 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
node.js文件上传重命名以及移动位置的示例代码
2018/01/19 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
javascript 数组精简技巧小结
2020/02/26 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[01:03:22]LGD vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
python实现稀疏矩阵示例代码
2017/06/09 Python
Python3 安装PyQt5及exe打包图文教程
2019/01/08 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
2020/01/08 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
2020/03/10 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
缓解脚、腿和背部疼痛:Z-CoiL鞋
2019/03/12 全球购物
中学生运动会通讯稿大全
2014/09/18 职场文书
2014年班组建设工作总结
2014/12/01 职场文书
法律服务所工作总结
2015/08/10 职场文书
六种css3实现的边框过渡效果
2021/04/22 HTML / CSS
Spring Data JPA框架Repository自定义实现
2022/04/28 Java/Android