浅谈使用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读csv文件去掉一列后再写入新的文件实例
Dec 28 Python
Python Unittest根据不同测试环境跳过用例的方法
Dec 16 Python
python+opencv实现高斯平滑滤波
Jul 21 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
Aug 28 Python
执行Django数据迁移时报 1091错误及解决方法
Oct 14 Python
Python 实现向word(docx)中输出
Feb 13 Python
Python 如何批量更新已安装的库
May 26 Python
python中判断文件结束符的具体方法
Aug 04 Python
Python实现迪杰斯特拉算法过程解析
Sep 18 Python
Python pymysql模块安装并操作过程解析
Oct 13 Python
PyCharm常用配置和常用插件(小结)
Feb 06 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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
php上传excel表格并获取数据
2017/04/27 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
Aster vs Newbee BO5 第三场2.19
2021/03/10 DOTA
js 巧妙去除数组中的重复项
2010/01/25 Javascript
jQuery中after的两种用法实例
2013/07/03 Javascript
Javascript表格翻页效果实现思路及代码
2013/08/23 Javascript
JQuery中clone方法复制节点
2015/05/18 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
2015/06/16 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
Vue.use源码分析
2017/04/22 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
在Vue中获取组件声明时的name属性方法
2018/09/12 Javascript
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
2020/10/18 Javascript
jquery实现穿梭框功能
2021/01/19 jQuery
[02:09]抵达西雅图!中国军团加油!
2014/07/07 DOTA
简单介绍Python中的struct模块
2015/04/28 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
2018/07/31 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
flask框架路由常用定义方式总结
2019/07/23 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
2020/03/09 Python
保卫钓鱼岛口号
2014/06/20 职场文书
2015年安全生产目标责任书
2015/01/29 职场文书
音乐教师求职信范文
2015/03/20 职场文书
小学体育组工作总结2015
2015/07/21 职场文书
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS
Redis配置外网可访问(redis远程连接不上)的方法
2022/12/24 Redis