浅谈使用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 21 Python
python 把数据 json格式输出的实例代码
Oct 31 Python
PyQt5实现简单数据标注工具
Mar 18 Python
OpenCV 轮廓检测的实现方法
Jul 03 Python
Python3的unicode编码转换成中文的问题及解决方案
Dec 10 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
Feb 03 Python
解决django框架model中外键不落实到数据库问题
May 20 Python
基于django micro搭建网站实现加水印功能
May 22 Python
Python基于smtplib模块发送邮件代码实例
May 29 Python
Python安装Bs4的多种方法
Nov 28 Python
浅析python字符串前加r、f、u、l 的区别
Jan 24 Python
10个顶级Python实用库推荐
Mar 04 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
Yii模型操作之criteria查找数据库的方法
2016/07/15 PHP
!DOCTYPE声明对JavaScript的影响分析
2010/04/12 Javascript
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
基于jQuery实现的当离开页面时出现提示的实现代码
2011/06/27 Javascript
js控制文本框输入的字符类型方法汇总
2015/06/19 Javascript
easyui messager alert 三秒后自动关闭提示的实例
2016/11/07 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
Javascript中Promise的四种常用方法总结
2017/07/14 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
2020/08/13 Javascript
[56:41]iG vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/17 DOTA
跟老齐学Python之??碌某?? target=
2014/09/12 Python
python创建进程fork用法
2015/06/04 Python
Python基础知识_浅谈用户交互
2017/05/31 Python
Python编写一个闹钟功能
2017/07/11 Python
Python创建字典的八种方式
2019/02/27 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
Python time库基本使用方法分析
2019/12/13 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
Django和Ueditor自定义存储上传文件的文件名
2021/02/25 Python
详解html5 postMessage解决跨域通信的问题
2018/08/17 HTML / CSS
TripAdvisor越南:全球领先的旅游网站
2017/09/21 全球购物
Spongelle官网:美国的创意护肤洗护品牌
2019/05/15 全球购物
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
洗煤厂厂长岗位职责
2014/01/03 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
学校食堂标语
2014/10/06 职场文书
幼儿园六一主持词
2015/06/30 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
微信小程序基础教程之echart的使用
2021/06/01 Javascript
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python
mysql幻读详解实例以及解决办法
2022/06/16 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL