浅谈使用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中尾递归用法实例详解
Apr 28 Python
Python使用ntplib库同步校准当地时间的方法
Jul 02 Python
centos6.7安装python2.7.11的具体方法
Jan 16 Python
django静态文件加载的方法
May 20 Python
python3使用SMTP发送HTML格式邮件
Jun 19 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
Sep 20 Python
python 经典数字滤波实例
Dec 16 Python
基于Pycharm加载多个项目过程图解
Jan 19 Python
Pandas实现一列数据分隔为两列
May 18 Python
python基于socket函数实现端口扫描
May 28 Python
使用python向MongoDB插入时间字段的操作
May 18 Python
python面向对象版学生信息管理系统
Jun 24 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执行速度全攻略(下)
2006/10/09 PHP
PHP脚本的10个技巧(6)
2006/10/09 PHP
php格式化工具Beautify PHP小小BUG
2008/04/24 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
PHP设计模式之PHP迭代器模式讲解
2019/03/22 PHP
基于PHP实现生成随机水印图片
2020/12/09 PHP
JQuery扩展插件Validate 5添加自定义验证方法
2011/09/05 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
jquery显示和隐藏div特效实例
2013/02/27 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
解析jquery获取父窗口的元素
2013/06/26 Javascript
js confirm()方法的使用方法实例
2013/07/13 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
2013/12/14 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
2014/12/16 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
[02:32]【DOTA2亚洲邀请赛】iceice,梦开始的地方
2017/03/13 DOTA
python简单获取数组元素个数的方法
2015/07/13 Python
python psutil库安装教程
2018/03/19 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
python命令行参数用法实例分析
2019/06/25 Python
python flask框架实现重定向功能示例
2019/07/02 Python
class类在python中获取金融数据的实例方法
2020/12/10 Python
python中spy++的使用超详细教程
2021/01/29 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
CSS3圆角和渐变2种常用功能详解
2016/01/06 HTML / CSS
英国领先的狗和宠物美容专家:Christies Direct
2017/04/03 全球购物
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
六十岁生日答谢词
2014/01/10 职场文书
作风大整顿心得体会
2014/09/10 职场文书
报到证办理个人委托书
2014/10/06 职场文书
工资收入证明
2014/10/07 职场文书
售票员岗位职责
2015/02/15 职场文书
Mysql超详细讲解死锁问题的理解
2022/04/01 MySQL