浅谈使用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高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 Python
centos系统升级python 2.7.3
Jul 03 Python
Python爬取读者并制作成PDF
Mar 10 Python
Python过滤列表用法实例分析
Apr 29 Python
sublime python3 输入换行不结束的方法
Apr 19 Python
python实现txt文件格式转换为arff格式
May 31 Python
python实现五子棋小游戏
Mar 25 Python
Django实现微信小程序的登录验证功能并维护登录态
Jul 04 Python
Django之使用内置函数和celery发邮件的方法示例
Sep 16 Python
Python 分布式缓存之Reids数据类型操作详解
Jun 24 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
Feb 24 Python
python 学习GCN图卷积神经网络
May 11 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生成图形(Libchart)实例
2013/11/06 PHP
Symfony数据校验方法实例分析
2015/01/26 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
学习js所必须要知道的一些
2007/03/07 Javascript
超级酷和最实用的jQuery实例收集(20个)
2010/04/21 Javascript
JS 树形递归实例代码
2010/05/18 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
AJAX实现瀑布流触发分页与分页触发瀑布流的方法
2016/05/23 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
Angular.Js之Scope作用域的学习教程
2017/04/27 Javascript
详解Layer弹出层样式
2017/08/21 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
微信小程序学习笔记之跳转页面、传递参数获得数据操作图文详解
2019/03/28 Javascript
微信小程序实现点击按钮后修改颜色
2019/12/05 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
2020/03/31 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
Python Django框架防御CSRF攻击的方法分析
2019/10/18 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
使用Matplotlib 绘制精美的数学图形例子
2019/12/13 Python
Python pandas如何向excel添加数据
2020/05/22 Python
乌克兰网上珠宝商店:GoldSoveren
2020/03/31 全球购物
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
常用UNIX 命令(Linux的常用命令)
2015/12/26 面试题
工商治理实习生的自我评价
2014/01/15 职场文书
楼面部长岗位职责范本
2014/02/14 职场文书
学校文明单位申报材料
2014/05/06 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书
广播稿:校园广播稿范文
2019/04/17 职场文书
如何制定一份可行的计划!
2019/06/21 职场文书
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers