在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 相关文章推荐
py2exe 编译ico图标的代码
Mar 08 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
Python实现读取Properties配置文件的方法
Mar 29 Python
Python创建普通菜单示例【基于win32ui模块】
May 09 Python
Python中实例化class的执行顺序示例详解
Oct 14 Python
CentOS7下安装python3.6.8的教程详解
Jan 03 Python
python 微信好友特征数据分析及可视化
Jan 07 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
python中sys模块的介绍与实例
Apr 17 Python
关于Numpy之repeat、tile的用法总结
Jun 02 Python
python之django路由和视图案例教程
Jul 26 Python
用PYTHON去计算88键钢琴的琴键频率和音高
Apr 10 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
抓取并下载CSS中所有图片文件的php代码
2011/09/26 PHP
php自定义session示例分享
2014/04/22 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
一实用的实现table排序的Javascript类库
2007/09/12 Javascript
JavaScript 函数式编程的原理
2009/10/16 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
javascript实现下拉提示选择框
2015/12/29 Javascript
常用原生JS兼容性写法汇总
2016/04/27 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
js接收并转化Java中的数组对象的方法
2016/08/11 Javascript
实现JavaScript高性能的数据存储
2016/12/11 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
2017/08/31 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
浅谈 Webpack 如何处理图片(开发、打包、优化)
2019/05/15 Javascript
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
jQuery AJAX应用实例总结
2020/05/19 jQuery
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
Python中input和raw_input的一点区别
2014/10/21 Python
python微信跳一跳系列之棋子定位颜色识别
2018/02/26 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
运动会广播稿200字
2014/01/15 职场文书
医院院务公开实施方案
2014/05/03 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
幼儿园大班毕业评语
2014/12/31 职场文书
皇城相府导游词
2015/02/06 职场文书
2015年大学生实习评语
2015/03/25 职场文书
互联网的下一个风口:新的独角兽将诞生
2019/08/02 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
html中两种获取标签内的值的方法
2022/06/10 HTML / CSS