getattr函数

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

>>> li = ["Larry", "Curly"]

>>> li.pop

// 该语句获取列表的 pop 方法的引用,注意该语句并不是调用 pop 方法,调用 pop 方法的应该是 li.pop(), 这里指的是方法对象本身。

>>> getattr(li, "pop")

// 该语句也是返回 pop 方法的引用,但是此时,方法名称是作为一个字符串参数传递给 getattr 函数的, getattr 是一个有用到令人无法致信的内置函数,可以返回任何对象的任何属性。在这个例子中,对象是一个 list, 属性是 pop 方法。

>>> getattr(li, "append")("Moe")

>>> li

['Larry', 'Curly', 'Moe']

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

>>> getattr({}, "clear")

// getattr 也可以作用于字典。

>>> getattr((), "pop")

Traceback (most recent call last):

File "", line 1, in

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

// 该语句返回 odbchelper 模块中 buildConnectionString 函数的引用

>>> getattr(odbchelper, "buildConnectionString")

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

>>> object = odbchelper

>>> method = "buildConnectionString"

>>> getattr(object, method)

// object 作为一个参数传递给函数, method 是方法或者函数的名称字符串。

>>> type(getattr(object, method))

>>> 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中通过getattr获取对象引用的方法

本文地址: http://www.cppcns.com/jiaoben/python/250588.html

python getattr调用自己模块_在Python中通过getattr获取对象引用的方法相关推荐

  1. Python可以调用Gpu吗_加快Python算法的四个方法:Numba篇

    CDA数据分析师 出品 相信大家在做一些算法经常会被庞大的数据量所造成的超多计算量需要的时间而折磨的痛苦不已,接下来我们围绕四个方法来帮助大家加快一下Python的计算时间,减少大家在算法上的等待时间 ...

  2. python下载matplotlib.finance模块_关于Matplotlib中No module named 'matplotlib.finance'的解决办法...

    最近在研究量化分析,需要用到matplotlib中的一个库,输入 from matplotlib.finance import quotes_historical_yahoo_ohlc, candle ...

  3. python测试代码与模块_测量Python代码运行时间

    Python 社区有句俗语: "python自己带着电池" ,别自己写计时框架. Python 2.3 具备一个叫做 timeit 的完美计时工具可以测量python代码的运行时间 ...

  4. python前端调用后端模型_【Python】【Flask】前端调用后端方法

    后端代码: @app.route("/test",methods=['POST','GET']) def test(): return "我是测试的" 前端代码 ...

  5. python 定时执行 爬虫 模块_【Python】定时执行网站爬虫

    今天我们额讨论如何使用Python,SQLite数据库与crontab工具将爬虫程序部署到服务器上并实现定时爬取存储 编写爬虫代码 编写一个爬虫程序,使用requests与beautifulsoup4 ...

  6. python 定时执行 爬虫 模块_浅析python实现scrapy定时执行爬虫

    项目需要程序能够放在超算中心定时运行,于是针对scrapy写了一个定时爬虫的程序main.py ,直接放在scrapy的存储代码的目录中就能设定时间定时多次执行. 最简单的方法:直接使用Timer类 ...

  7. python如何导入自定义模块_【python】导入自定义模块

    一.直接import 1.当执行文件与要导入的py文件在同一目录下时 假设要在wangyi.py中导入weibo.py文件 import weibo 2.当执行文件与要导入的py文件所在文件夹在同一目 ...

  8. python 命令行解析模块_【Python模块】命令行解析--argparse

    python命令行解析 前言 当你还在使用 if len(sys.argv) > 1: 这样的方式判断选项和参数的时候,是否已意识到已经落伍了. 我在bash中用过getopt getopts, ...

  9. python如何调用参数配置文件_【Python学习笔记七】从配置文件中读取参数

    将一些需要经常更改的参数存放在配置文件中,通过读取配置文件来获取参数,这样修改以及使用起来比较方便 1.首先是配置文件的写法,如下一个environment.ini文件: a:里面"[]&q ...

最新文章

  1. ​简单四步,快速判断真菌是否成功侵染宿主植物
  2. 【Matlab 图像】灰度二值化处理
  3. mongodb studio 3t 破解无限使用脚本
  4. Paul Rayner认为DDD和敏捷可以共存
  5. LINUX操作系统的内核编译内幕详解一
  6. 吴恩达深度学习之五《序列模型》学习笔记
  7. pg注释某一段语句不执行_@Autowired的使用:推荐对构造函数进行注释
  8. 如何将Mac上的墙纸更改为任何图像?
  9. C/C++变量在内存中的位置及初始化问题
  10. McAfee VirusScan Enterprise
  11. VS2013的下载与安装
  12. 在2020年使用黑莓9720+BBOS7三个月的感受
  13. CISSP-考纲分析
  14. 微信、QQ上线国产系统UOS:界面曝光
  15. 本学期在实验室的收获
  16. 揭秘 Win8 电脑 OEM 分区创建
  17. 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 HDU - 2191(特殊01背包)
  18. 国际商务谈判A卷+答案
  19. 人类一败涂地做图教程_人类一败涂地怎么捏人?自定义人物PS制作教程
  20. celery beat一直不触发任务(卡在Writing entries...)

热门文章

  1. 通过COS上传文件至腾讯云
  2. bzoj 1069 [SCOI2007]最大土地面积——旋转卡壳
  3. MySQL数据库应用第3章操作数据库
  4. POJ 3855 计算几何·多边形重心
  5. Java杂记3—流程控制之条件
  6. vue学习笔记(三)
  7. Visual Studio 15.4发布,新增多平台支持
  8. Silverlight Telerik RadGridView动态增删行及行列操作(转载)
  9. 不想当管理者、甚至连项目经理都也不想当,只想静心写写代码、不做管理
  10. html中如何屏蔽一段代码,html中如何使用python屏蔽一些基本功能(示例代码)