浅谈使用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的Twisted框架中Deferred对象的用法
May 25 Python
python3实现逐字输出的方法
Jan 23 Python
Pandas统计重复的列里面的值方法
Jan 30 Python
Python绘制频率分布直方图的示例
Jul 08 Python
把django中admin后台界面的英文修改为中文显示的方法
Jul 26 Python
PyTorch中常用的激活函数的方法示例
Aug 20 Python
Python上下文管理器全实例详解
Nov 12 Python
python 实现将list转成字符串,中间用空格隔开
Dec 25 Python
Python第三方包之DingDingBot钉钉机器人
Apr 09 Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 Python
详解python logging日志传输
Jul 01 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
Jan 15 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操作数组的一些函数整理介绍
2011/07/17 PHP
php检测用户是否用手机(Mobile)访问网站的类
2014/01/09 PHP
php 类中的常量、静态属性、非静态属性的区别
2017/04/09 PHP
PHP解决中文乱码
2017/04/28 PHP
通过JAVAScript实现页面自适应
2007/01/19 Javascript
你必须知道的Javascript知识点之"深入理解作用域链"的介绍
2013/04/23 Javascript
js arguments,jcallee caller用法总结
2013/11/30 Javascript
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
JavaScript学习笔记整理_setTimeout的应用
2016/09/19 Javascript
Json按某个键的值进行排序
2016/12/22 Javascript
jQuery+ajax实现修改密码验证功能实例详解
2017/07/06 jQuery
详解vue-cli脚手架中webpack配置方法
2018/08/22 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
js实现简单选项卡制作
2020/08/05 Javascript
[01:07:46]完美世界DOTA2联赛循环赛 Magma vs IO BO2第二场 11.01
2020/11/02 DOTA
12步教你理解Python装饰器
2016/02/25 Python
利用Pandas 创建空的DataFrame方法
2018/04/08 Python
pandas 读取各种格式文件的方法
2018/06/22 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
python爬取本站电子书信息并入库的实现代码
2020/01/20 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
2020/05/26 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
CSS3中的Transition过度与Animation动画属性使用要点
2016/05/20 HTML / CSS
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
Stuart Weitzman欧盟:美国奢华鞋履品牌
2017/05/24 全球购物
G-Form护具官方网站:美国运动保护装备
2019/09/04 全球购物
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
董事长助理岗位职责
2014/02/18 职场文书
公司晚会主持词
2014/03/22 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
优秀员工演讲稿
2014/05/19 职场文书
党员志愿者活动总结
2014/06/26 职场文书
我的法兰西岁月观后感
2015/06/09 职场文书
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技
Python实现简单得递归下降Parser
2022/05/02 Python