在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常用随机数与随机字符串方法实例
Apr 09 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
Nov 16 Python
Python中安装easy_install的方法
Nov 18 Python
django框架用户权限中的session缓存到redis中的方法
Aug 06 Python
pytorch 预训练层的使用方法
Aug 20 Python
python+Django实现防止SQL注入的办法
Oct 31 Python
python对象销毁实例(垃圾回收)
Jan 16 Python
Python @property及getter setter原理详解
Mar 31 Python
Python pandas如何向excel添加数据
May 22 Python
如何使用pycharm连接Databricks的步骤详解
Sep 23 Python
详解用python -m http.server搭一个简易的本地局域网
Sep 24 Python
python读取pdf格式文档的实现代码
Apr 01 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
php5 apache 2.2 webservice 创建与配置(java)
2011/01/27 PHP
php数组(array)输出的三种形式详解
2013/06/05 PHP
php检测url是否存在的方法
2015/04/14 PHP
php 实现银联商务H5支付的示例代码
2019/10/12 PHP
Prototype使用指南之dom.js
2007/01/10 Javascript
不错的JS中变量相关的细节分析
2007/08/13 Javascript
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
jquery select(列表)的操作(取值/赋值)
2011/03/16 Javascript
QQ登录背景闪动效果附效果演示源码下载
2015/09/22 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
微信小程序动态显示项目倒计时效果
2017/06/13 Javascript
在vue中阻止浏览器后退的实例
2019/11/06 Javascript
Python中处理unchecked未捕获异常实例
2015/01/17 Python
Flask入门之上传文件到服务器的方法示例
2018/07/18 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
关于Python字符串显示u...的解决方式
2020/03/06 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
python3代码输出嵌套式对象实例详解
2020/12/03 Python
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
Tripadvisor新西兰:阅读评论,比较价格和酒店预订
2018/02/10 全球购物
英国空调、除湿机和通风设备排名第一:Air Con Centre
2019/02/25 全球购物
介绍一下Linux内核的排队自旋锁
2014/01/04 面试题
如何进行有效的自我评价
2013/09/27 职场文书
优秀学生干部推荐材料
2014/02/03 职场文书
公务员政审个人鉴定
2014/02/25 职场文书
财务管理专业求职信
2014/06/11 职场文书
服务标语大全
2014/06/18 职场文书
离婚协议书怎么写
2014/09/12 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
2015年市场部工作总结
2015/04/30 职场文书
乡镇团委工作总结2015
2015/05/26 职场文书
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers