浅谈使用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实现QQ游戏大家来找茬辅助工具
Sep 14 Python
python数据结构之图的实现方法
Jul 08 Python
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
Jul 20 Python
python设置值及NaN值处理方法
Jul 03 Python
通过pykafka接收Kafka消息队列的方法
Dec 27 Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 Python
解决yum对python依赖版本问题
Jul 05 Python
python实现图像拼接
Mar 05 Python
降低python版本的操作方法
Sep 11 Python
python Scrapy爬虫框架的使用
Jan 21 Python
Python3中对json格式数据的分析处理
Jan 28 Python
pytorch 中autograd.grad()函数的用法说明
May 12 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 session的传递方式
2016/06/15 PHP
php 调用ffmpeg获取视频信息的简单实现
2017/04/03 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
2017/04/18 PHP
PHP中echo与print区别点整理
2021/03/09 PHP
js 手机号码合法性验证代码集合
2012/09/29 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
jQuery编辑器KindEditor4.1.4代码高亮显示设置教程
2013/03/01 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
JavaScript动态改变div属性的实现方法
2015/07/22 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
d3.js实现自定义多y轴折线图的示例代码
2018/05/30 Javascript
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
2019/06/10 jQuery
微信小程序新闻网站详情页实例代码
2020/01/10 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
解决vue项目本地启动时无法携带cookie的问题
2021/02/06 Vue.js
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
[30:37]【全国守擂赛】第三周擂主赛 Dark Knight vs. Leopard Gaming
2020/05/04 DOTA
Python实现高效求解素数代码实例
2015/06/30 Python
python中星号变量的几种特殊用法
2016/09/07 Python
tensorflow实现softma识别MNIST
2018/03/12 Python
英国殿堂级有机护肤品牌:Rodial
2017/04/17 全球购物
澳大利亚在线性感内衣商店:Fantasy Lingerie
2021/02/07 全球购物
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
铁路工务反思材料
2014/02/07 职场文书
不拖欠农民工工资承诺书
2014/03/31 职场文书
幼儿园社区活动总结
2014/07/07 职场文书
颂军魂爱军营演讲稿
2014/09/13 职场文书
教师业务学习材料
2014/12/16 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书