python中getattr函数使用方法 getattr实现工厂模式


Posted in Python onJanuary 20, 2014

看了下函数本身的doc

getattr(object, name[, default]) -> value
Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y. 
When a default argument is given, it is returned when the attribute doesn't 
exist; without it, an exception is raised in that case.

解释的很抽象 告诉我这个函数的作用相当于是

object.name

试了一下getattr(object,name)确实和object.name是一样的功能.只不过这里可以把name作为一个变量去处理书上的例子很好的说明了这个函数的功用,使用getattr可以轻松实现工厂模式。

例:一个模块支持html、text、xml等格式的打印,根据传入的formate参数的不同,调用不同的函数实现几种格式的输出

import statsout 
def output(data, format="text"):                           
    output_function = getattr(statsout, "output_%s" %format) 
    return output_function(data)
[code]
这个例子中可以根据传入output函数的format参数的不同 去调用statsout模块不同的方法(用格式化字符串实现output_%s)
返回的是这个方法的对象 就可以直接使用了 如果要添加新的格式 只需要在模块中写入新的方法函数 在调用output函数时使用新的参数就可以使用不同的格式输出
确实很方便

为了加深对getattr函数的理解 转载一篇英文的说明
Python's getattr function is used to fetch an attribute from an object, using a string object instead of an identifier to identify the attribute. In other words, the following two statements are equivalent:
[code]
value = obj.attribute
value = getattr(obj, "attribute")
If the attribute exists, the corresponding value is returned. If the attribute does not exist, you get an AttributeError exception instead.
The getattr function can be used on any object that supports dotted notation (by implementing the __getattr__ method). This includes class objects, modules, and even function objects.
path = getattr(sys, "path")
doc = getattr(len, "__doc__")
The getattr function uses the same lookup rules as ordinary attribute access, and you can use it both with ordinary attributes and methods:
result = obj.method(args)
func = getattr(obj, "method")
result = func(args)
or, in one line:
result = getattr(obj, "method")(args)
Calling both getattr and the method on the same line can make it hard to handle exceptions properly. To avoid confusing AttributeError exceptions raised by getattr with similar exceptions raised inside the method, you can use the following pattern:
try:
    func = getattr(obj, "method")
except AttributeError:
    ... deal with missing method ...
else:
    result = func(args)
The function takes an optional default value, which is used if the attribute doesn't exist. The following example only calls the method if it exists:
func = getattr(obj, "method", None)
if func:
    func(args)
Here's a variation, which checks that the attribute is indeed a callable object before calling it.
func = getattr(obj, "method", None)
if callable(func):
    func(args)
Python 相关文章推荐
Python科学计算之Pandas详解
Jan 15 Python
简单实现python数独游戏
Mar 30 Python
python搭建服务器实现两个Android客户端间收发消息
Apr 12 Python
PyTorch线性回归和逻辑回归实战示例
May 22 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
Jun 24 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
Python实现直播推流效果
Nov 26 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
Python使用py2neo操作图数据库neo4j的方法详解
Jan 13 Python
Python实现投影法分割图像示例(二)
Jan 17 Python
SpringBoot实现登录注册常见问题解决方案
Mar 04 Python
python字符串加密解密的三种方法分享(base64 win32com)
Jan 19 #Python
python实现人人网登录示例分享
Jan 19 #Python
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
Jan 19 #Python
压缩包密码破解示例分享(类似典破解)
Jan 17 #Python
vc6编写python扩展的方法分享
Jan 17 #Python
python的urllib模块显示下载进度示例
Jan 17 #Python
Python中for循环详解
Jan 17 #Python
You might like
php 删除目录下N分钟前创建的所有文件的实现代码
2013/08/10 PHP
PHP中的密码加密的解决方案总结
2016/10/26 PHP
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
表格奇偶行设置不同颜色的核心JS代码
2013/12/24 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
2016/12/08 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
浅谈微信小程序flex布局基础
2018/09/10 Javascript
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
使用pkg打包Node.js应用的方法步骤
2018/10/19 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
JavaScript Canvas编写炫彩的网页时钟
2019/10/16 Javascript
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
[01:33:25]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第一场 1月24日
2021/03/11 DOTA
Python中运行并行任务技巧
2015/02/26 Python
Python简单调用MySQL存储过程并获得返回值的方法
2015/07/20 Python
深入理解python中的atexit模块
2017/03/07 Python
python logging 日志的级别调整方式
2020/02/21 Python
如何使用pandas读取txt文件中指定的列(有无标题)
2020/03/05 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
瑞典最大的儿童用品网上商店:pinkorblue.se
2021/03/09 全球购物
幼师自荐信范文
2013/10/06 职场文书
促销活动计划书
2014/05/02 职场文书
环保倡议书500字
2014/05/15 职场文书
奥运会口号
2014/06/13 职场文书
校长创先争优承诺书
2014/08/30 职场文书
群众路线四风自我剖析材料
2014/10/08 职场文书
杭州西湖英语导游词
2015/02/03 职场文书
小学教师自我评价
2015/03/04 职场文书
2016保送生自荐信范文
2016/01/29 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书