浅谈使用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 相关文章推荐
PyCharm 常用快捷键和设置方法
Dec 20 Python
Python自定义一个类实现字典dict功能的方法
Jan 19 Python
python向字符串中添加元素的实例方法
Jun 28 Python
PyQtGraph在pyqt中的应用及安装过程
Aug 04 Python
Python3 shelve对象持久存储原理详解
Mar 23 Python
python实现简单坦克大战
Mar 27 Python
新建文件时Pycharm中自动设置头部模板信息的方法
Apr 17 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
May 27 Python
使用Python构造hive insert语句说明
Jun 06 Python
Python venv虚拟环境配置过程解析
Jul 08 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
Nov 10 Python
python中四舍五入的正确打开方式
Jan 18 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
使ecshop模板中可引用常量的实现方法
2011/06/02 PHP
ajax取消挂起请求的处理方法
2013/03/18 PHP
基于PHPExcel的常用方法总结
2013/06/13 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
2013/06/20 PHP
Symfony2开发之控制器用法实例分析
2016/02/05 PHP
thinkPHP实现多字段模糊匹配查询的方法
2016/12/01 PHP
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
JavaScript调用ajax获取文本文件内容实现代码
2014/03/28 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
2016/08/05 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
javascript自执行函数
2017/02/10 Javascript
Axios学习笔记之使用方法教程
2017/07/21 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
Vue引入sass并配置全局变量的方法
2018/06/27 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
分享6个隐藏的python功能
2017/12/07 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
python递归实现快速排序
2018/08/18 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
python实现五子棋小程序
2019/06/18 Python
Python 读取 YUV(NV12) 视频文件实例
2019/12/09 Python
如何用python免费看美剧
2020/08/11 Python
希尔顿酒店官方网站:Hilton Hotels
2017/06/01 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
优秀应届毕业生自荐信
2013/11/16 职场文书
11月红领巾广播稿
2014/01/17 职场文书
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
英文推荐信格式范文
2014/05/09 职场文书
八一建军节营销活动方案
2014/08/31 职场文书
计划生育诚信协议书
2014/11/02 职场文书
音乐教师个人总结
2015/02/06 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书