在Python中通过getattr获取对象引用的方法


Posted in Python onJanuary 21, 2019

getattr函数

(1)使用 getattr 函数,可以得到一个直到运行时才知道名称的函数的引用。

>>> li = ["Larry", "Curly"]
>>> li.pop
<built-in method pop of list object at 0x7fb75c255518>
// 该语句获取列表的 pop 方法的引用,注意该语句并不是调用 pop 方法,调用 pop 方法的应该是 li.pop(), 这里指的是方法对象本身。

>>> getattr(li, "pop")
<built-in method pop of list object at 0x7fb75c2556c8>
// 该语句也是返回 pop 方法的引用,但是此时,方法名称是作为一个字符串参数传递给 getattr 函数的, getattr 是一个有用到令人无法致信的内置函数,可以返回任何对象的任何属性。在这个例子中,对象是一个 list, 属性是 pop 方法。

>>> getattr(li, "append")("Moe")
>>> li
['Larry', 'Curly', 'Moe']
// 如果不确信它是多么的有用,试试这个: getattr 的返回值是 方法, 然后你就可以调用它,就像直接使用 li.append("Moe") 一样, 但是实际上你没有直接调用函数, 只是以字符串形式指定了函数名称。

>>> getattr({}, "clear")
<built-in method clear of dict object at 0x7fb75c273b40>
// getattr 也可以作用于字典。

>>> getattr((), "pop")
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'pop'
// 理论上, getattr 可以作用于元组,但是由于元组没有方法,所以不管你指定什么属性名称 getattr 都会引发一个异常。

(2)用于模块的 getattr : getattr不仅仅适用于内置数据类型,也可作用于模块。

// odbchelper.py
def buildConnectionString(params):
  """Build a connection string from a dictionary of parameters. 
  Returns string."""
  return ";".join(["%s=%s" % (k, v) for k, v in params.items()])

if __name__ == "__main__":
  myParams = {"server":"mpilgrim",\
        "database":"master",\
        "uid":"sa",\
        "pwd":"secret"
        }
  print buildConnectionString(myParams)
// end

>>> import odbchelper
>>> odbchelper.buildConnectionString
<function buildConnectionString at 0x7fb75c26e848>
// 该语句返回 odbchelper 模块中 buildConnectionString 函数的引用

>>> getattr(odbchelper, "buildConnectionString")
<function buildConnectionString at 0x7fb75c26e848>
// 使用 getattr, 你能够获得同一函数的同一引用, 通常, getattr(object," attribute ")等价于 object.attribute, 如果 object 是一个模块的话,那么 attribute 可能是定义在模块中的任何东西:函数、类或者全局变量。

>>> object = odbchelper
>>> method = "buildConnectionString"
>>> getattr(object, method)
<function buildConnectionString at 0x7fb75c26e848>
// object 作为一个参数传递给函数, method 是方法或者函数的名称字符串。

>>> type(getattr(object, method))
<type 'function'>
>>> import types
>>> type(getattr(object, method)) == types.FunctionType
True
// method 是函数的名称,通过获取 type 可以进行验证。

>>> callable(getattr(object, method))
True
// 由于 method 是一个函数, 所以它是可调用的。

(3)getattr 作为一 个分发者

getattr 常见的使用模式是作为一个分发者。举个例子, 如果你有一个程序可以以不同的格式输出数据,你可以为每种输出格式定义各自的格式输出函数, 然后使用唯一的分发函数调用所需的格式输出函数。

例如, 我们假设有一个以 HTML、XML 和普通文本格式打印站点统计的程序。输出格式在命令行中指定, 或者保存在配置文件中, statsout 模块定义了三个函数: output_html 、 output_xml 和 output_text , 然后主程序定义了唯一的输出函数, 如下:

import statsout

def output(data, format="text"):    (1)
  output_function = getattr(statsout, "output_%s" % \
          format, statsout.output_text)   (2)
  return output_function(data)    (3)

(1) output 函数接收一个必备参数 data, 和一个可选参数 format, 如果没有指定 format 参数, 其缺省值是 text 并完成普通文本输出函数的调用。

(2) 你可以连接 format 参数值和 “output_” 来创建一个函数名称作为参数值, 然后从 statsout 模块中取得该函数, 第三个参数是一个缺省返回值, 如果第二个参数指定的属性或者方法没能找到, 则将返回这个缺省返回值。这种方式允许今后很容易地扩展程序以支持其它的输出格式,而且无需修改分发函数。所要做的仅仅是向 statsout 中添加一个函数,比如 output_pdf, 之后只要将 “pdf” 作为 format 的参数值传递给 output 函数即可。

(3) 现在你可以简单地调用输出函数,就像调用其它函数一样, output_function 变量是指向 statsout 模块中相应函数的引用。

以上这篇在Python中通过getattr获取对象引用的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python程序员鲜为人知但你应该知道的17个问题
Jun 04 Python
Python中DJANGO简单测试实例
May 11 Python
Python中用max()方法求最大值的介绍
May 15 Python
Python按行读取文件的实现方法【小文件和大文件读取】
Sep 19 Python
Python3读取Excel数据存入MySQL的方法
May 04 Python
Django中使用第三方登录的示例代码
Aug 20 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
Nov 10 Python
python仿抖音表白神器
Apr 08 Python
selenium+python环境配置教程详解
May 28 Python
python3 实现的对象与json相互转换操作示例
Aug 17 Python
Python中关于浮点数的冷知识
Sep 22 Python
python opencv 实现对图像边缘扩充
Jan 19 Python
python实现windows壁纸定期更换功能
Jan 21 #Python
PyQt5+requests实现车票查询工具
Jan 21 #Python
Python设计模式之策略模式实例详解
Jan 21 #Python
Python设计模式之装饰模式实例详解
Jan 21 #Python
python利用Tesseract识别验证码的方法示例
Jan 21 #Python
对python过滤器和lambda函数的用法详解
Jan 21 #Python
利用Python正则表达式过滤敏感词的方法
Jan 21 #Python
You might like
利用PHP+JS实现搜索自动提示(实例)
2013/06/09 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
php函数连续调用实例分析
2015/07/30 PHP
PHP中include()与require()的区别说明
2017/02/14 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
浅谈PHP之ThinkPHP框架使用详解
2020/07/21 PHP
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
JavaScript中的console.group()函数详细介绍
2014/12/29 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
2015/04/01 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
js 获取站点应用名的简单实例
2016/08/18 Javascript
原生js实现淘宝购物车功能
2020/06/23 Javascript
基于JavaScript实现验证码功能
2017/04/01 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
2018/09/18 Javascript
Vue实现回到顶部和底部动画效果
2019/07/31 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
vue实现图片裁剪后上传
2020/12/16 Vue.js
[02:45]DOTA2英雄敌法师基础教程
2013/11/25 DOTA
python基础教程之数字处理(math)模块详解
2014/03/25 Python
Python中文分词实现方法(安装pymmseg)
2016/06/14 Python
Python爬取网易云音乐热门评论
2017/03/31 Python
python简单线程和协程学习心得(分享)
2017/06/14 Python
Python语言实现将图片转化为html页面
2017/12/06 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
Python3操作读写CSV文件使用包过程解析
2020/04/10 Python
Django 用户登陆访问限制实例 @login_required
2020/05/13 Python
萨克斯第五大道英国:Saks Fifth Avenue英国
2019/04/01 全球购物
德尔福集团DELPHI的笔试题
2012/02/22 面试题
银行进社区活动总结
2014/07/07 职场文书
2014教师年度思想工作总结
2014/11/10 职场文书
社区结对共建协议书
2016/03/23 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers