在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 相关文章推荐
Django中URL视图函数的一些高级概念介绍
Jul 20 Python
python 中split 和 strip的实例详解
Jul 12 Python
Python中Selenium模拟JQuery滑动解锁实例
Jul 26 Python
Python中的Django基本命令实例详解
Jul 15 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
Dec 05 Python
对Python中DataFrame选择某列值为XX的行实例详解
Jan 29 Python
Python实用工具FuckIt.py介绍
Jul 02 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
Aug 07 Python
QML使用Python的函数过程解析
Sep 26 Python
Python yield生成器和return对比代码实例
Apr 20 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
Jul 03 Python
python基础之爬虫入门
May 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
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
常见PHP数据库解决方案分析介绍
2015/09/24 PHP
Yii CGridView用法实例详解
2016/07/12 PHP
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
2009/11/26 Javascript
使用闭包对setTimeout进行简单封装避免出错
2013/07/10 Javascript
js冒泡、捕获事件及阻止冒泡方法详细总结
2014/05/08 Javascript
javascript操作excel生成报表示例
2014/05/08 Javascript
node.js中的fs.futimesSync方法使用说明
2014/12/17 Javascript
JS中完美兼容各大浏览器的scrolltop方法
2015/04/17 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
Nodejs 复制文件/文件夹的方法
2017/08/24 NodeJs
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
微信小程序云开发如何使用云函数生成二维码
2019/05/18 Javascript
如何在微信小程序中实现Mixins方案
2019/06/20 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
2020/03/12 Javascript
Python中数字以及算数运算符的相关使用
2015/10/12 Python
Python对数据进行插值和下采样的方法
2018/07/03 Python
python检测服务器端口代码实例
2019/08/31 Python
基于Django统计博客文章阅读量
2019/10/29 Python
利用Vscode进行Python开发环境配置的步骤
2020/06/22 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
2013/01/23 HTML / CSS
详解利用css3的var()实现运行时改变scss的变量值
2021/03/02 HTML / CSS
TripAdvisor越南:全球领先的旅游网站
2017/09/21 全球购物
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
意大利折扣和优惠券网站:Groupalia
2019/10/09 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
信息管理员岗位职责
2013/12/01 职场文书
教师对学生的寄语
2014/04/03 职场文书
房屋租赁协议书
2014/10/18 职场文书
学生病假条怎么写
2015/08/17 职场文书
婚礼答谢词范文
2015/09/29 职场文书
《草虫的村落》教学反思
2016/02/20 职场文书
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js