浅谈使用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模块restful使用方法实例
Dec 10 Python
用Python实现协同过滤的教程
Apr 08 Python
python使用socket向客户端发送数据的方法
Apr 29 Python
使用PyCharm创建Django项目及基本配置详解
Oct 24 Python
python爬取网易云音乐评论
Nov 16 Python
浅析Windows 嵌入python解释器的过程
Jul 26 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
Oct 30 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
Mar 12 Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 Python
使用npy转image图像并保存的实例
Jul 01 Python
pycharm 代码自动补全的实现方法(图文)
Sep 18 Python
Python jiaba库的使用详解
Nov 23 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最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
PHP判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
php安装ssh2扩展的方法【Linux平台】
2016/07/20 PHP
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
jQuery与ExtJS之选择实例分析
2010/08/19 Javascript
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
jQuery基于ajax实现星星评论代码
2015/08/07 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
angular2使用简单介绍
2016/03/01 Javascript
微信小程序 同步请求授权的详解
2017/08/04 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
vue better-scroll插件使用详解
2018/01/25 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
Python2.7 实现引入自己写的类方法
2018/04/29 Python
python实现搜索文本文件内容脚本
2018/06/22 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
python 对一幅灰度图像进行直方图均衡化
2020/10/27 Python
CSS3不透明度实例讲解
2016/04/26 HTML / CSS
浅谈HTML5 & CSS3的新交互特性
2016/07/19 HTML / CSS
城野医生官方海外旗舰店:风靡亚洲毛孔收敛水
2018/04/26 全球购物
Javascript如何发送一个Ajax请求
2015/01/26 面试题
初中生个人学习的自我评价
2013/12/04 职场文书
小区推广策划方案
2014/06/06 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
2015年服务员工作总结
2015/04/08 职场文书
英语通知范文
2015/04/22 职场文书
文明旅游倡议书
2015/04/28 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书
导游词之南京中山陵
2019/11/27 职场文书
python实战之一步一步教你绘制小猪佩奇
2021/04/22 Python