浅谈使用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数据可视化之画图
Jan 15 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
Mar 18 Python
Python3.5 Pandas模块之DataFrame用法实例分析
Apr 23 Python
python实现植物大战僵尸游戏实例代码
Jun 10 Python
python常用函数与用法示例
Jul 02 Python
Python编程实现tail-n查看日志文件的方法
Jul 08 Python
python3获取当前目录的实现方法
Jul 29 Python
Kears+Opencv实现简单人脸识别
Aug 28 Python
使用python实现画AR模型时序图
Nov 20 Python
django2.2 和 PyMySQL版本兼容问题
Feb 17 Python
python 串行执行和并行执行实例
Apr 30 Python
Python面向对象编程之类的概念
Nov 01 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 第三节 变量介绍
2012/04/28 PHP
php实现httpRequest的方法
2015/03/13 PHP
showModalDialog 和 showModelessDialog
2007/01/22 Javascript
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
JavaScript ECMA-262-3 深入解析.第三章.this
2011/09/28 Javascript
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
使用GruntJS构建Web程序之合并压缩篇
2014/06/06 Javascript
全面解析node 表单的图片上传
2016/11/21 Javascript
jQuery 出现Cannot read property ‘msie’ of undefined错误的解决方法
2016/11/23 Javascript
angularjs使用directive实现分页组件的示例
2017/02/07 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
2017/04/29 jQuery
JavaScript登录验证基础教程
2017/11/01 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
[01:28]一分钟告诉你DOTA2 TI9不朽宝藏Ⅱ中有什么!
2019/07/09 DOTA
haskell实现多线程服务器实例代码
2013/11/26 Python
Python编写百度贴吧的简单爬虫
2015/04/02 Python
Python字符串和文件操作常用函数分析
2015/04/08 Python
详解Python核心对象类型字符串
2018/02/11 Python
在python中利用opencv简单做图片比对的方法
2019/01/24 Python
如何使用python爬虫爬取要登陆的网站
2019/07/12 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
2020/02/26 Python
python爬虫用mongodb的理由
2020/07/28 Python
Python如何重新加载模块
2020/07/29 Python
python 基于selenium实现鼠标拖拽功能
2020/12/24 Python
物业经理自我鉴定
2014/03/03 职场文书
企业节能减排实施方案
2014/03/19 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
党支部创先争优承诺书
2014/08/30 职场文书
2014县委书记党的群众路线教育实践活动对照检查材料思想汇报
2014/09/22 职场文书
MySQL分区表管理命令汇总
2022/03/21 MySQL