浅谈使用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简单实现基于SSL的IRC bot实例
Jun 15 Python
python3+PyQt5实现自定义流体混合窗口部件
Apr 24 Python
解决matplotlib库show()方法不显示图片的问题
May 24 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
May 25 Python
谈谈Python中的while循环语句
Mar 10 Python
python 同时读取多个文件的例子
Jul 16 Python
详解python中index()、find()方法
Aug 29 Python
python利用线程实现多任务
Sep 18 Python
python中判断数字是否为质数的实例讲解
Dec 06 Python
jupyter notebook更换皮肤主题的实现
Jan 07 Python
PyQt5实现多张图片显示并滚动
Jun 11 Python
Python开发五子棋小游戏
May 02 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处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
php实现通过cookie换肤的方法
2015/07/13 PHP
php加密之discuz内容经典加密方式实例详解
2017/02/04 PHP
php实现PDO中捕获SQL语句错误的方法
2017/02/16 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
2014/03/18 Javascript
高效利用Angular中内置服务$http、$location等
2016/03/22 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
jQuery动态加载css文件实现方法
2016/06/15 Javascript
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
js生成随机颜色方法代码分享(三种)
2016/12/29 Javascript
JavaScript ES6中const、let与var的对比详解
2017/06/18 Javascript
js数字滑动时钟的简单实现(示例讲解)
2017/08/14 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
2020/07/11 Javascript
Python使用回溯法子集树模板解决爬楼梯问题示例
2017/09/08 Python
tensorflow获取变量维度信息
2018/03/10 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
使用numba对Python运算加速的方法
2018/10/15 Python
Python多线程应用于自动化测试操作示例
2018/12/06 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
2020/01/13 Python
详解Pycharm安装及Django安装配置指南
2020/09/15 Python
data:image data url 文件转为Blob上传后端的方法
2019/07/16 HTML / CSS
苹果香港官方商城:Apple香港
2016/09/14 全球购物
校园招聘策划书
2014/01/09 职场文书
毕业生求职信的经典写法
2014/01/31 职场文书
小班下学期评语
2014/05/04 职场文书
关于读书的演讲稿1000字
2014/08/27 职场文书
居委会四风问题个人对照检查材料
2014/09/25 职场文书
采购员岗位职责
2015/02/03 职场文书
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
2022/05/04 Python