浅谈使用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使用cPickle模块序列化实例
Sep 25 Python
python 添加用户设置密码并发邮件给root用户
Jul 25 Python
Python中列表list以及list与数组array的相互转换实现方法
Sep 22 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
Python3.7 dataclass使用指南小结
Feb 22 Python
python实现五子棋小程序
Jun 18 Python
python经典趣味24点游戏程序设计
Jul 26 Python
自适应线性神经网络Adaline的python实现详解
Sep 30 Python
django项目中新增app的2种实现方法
Apr 01 Python
Python基于QQ邮箱实现SSL发送
Apr 26 Python
Python绘图之二维图与三维图详解
Aug 04 Python
详解python网络进程
Jun 15 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的引用原因分析
2012/09/06 PHP
php while循环得到循环次数
2013/10/26 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
2014/06/12 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
thinkphp3.2框架中where条件查询用法总结
2019/08/13 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
2019/10/18 PHP
仿当当网淘宝网等主流电子商务网站商品分类导航菜单
2013/09/25 Javascript
EasyUI中combobox默认值注意事项
2015/03/01 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
2016/02/14 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
2016/12/01 Javascript
纯js实现倒计时功能
2017/01/06 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
2017/03/09 Javascript
微信小程序 选项卡的简单实例
2017/05/24 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
使用JavaScript中的lodash编写双色球效果
2018/06/24 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
Vue列表如何实现滚动到指定位置样式改变效果
2020/05/09 Javascript
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
Python中的sort()方法使用基础教程
2017/01/08 Python
Python向日志输出中添加上下文信息
2017/05/24 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
2017/08/18 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
2019/01/30 Python
Python 简单计算要求形状面积的实例
2020/01/18 Python
解决Python 写文件报错TypeError的问题
2020/10/23 Python
名词解释型面试题(主要是网络)
2013/12/27 面试题
上班离岗检讨书
2014/01/27 职场文书
内刊编辑求职自荐书范文
2014/02/19 职场文书
海飞丝广告词
2014/03/20 职场文书
个人授权委托书
2014/09/15 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
护理自荐信
2019/05/14 职场文书
mysql sock文件存储了什么信息
2022/07/15 MySQL