在Python中通过getattr获取对象引用的方法
- 更新时间:2022-06-27 09:10:26
- 编辑:金飞跃
参考资料
- Python程序设计与算法基础教程 PDF 电子书 / 107.6 MB / 江红、余青松 推荐度:
- Python黑客攻防入门 PDF 电子书 / 63.1 MB / 赵诚文 推荐度:
- 《Python趣味编程入门》代码文件 配套资源 / 34.34 KB / (英)迈克·桑德斯(Mike Saund 推荐度:
正文内容
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硬币兑换思路和方法
这篇文章主要介绍了Python 硬币兑换问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
发布时间:2020-01-18
-
Python实现将数据写入netCDF4中的方法总结
这篇文章主要介绍了Python实现将数据写入netCDF4中的方法,涉及Python数据处理与文件读写相关操作技巧,需要的朋友可以参考下
发布时间:2019-06-17
-
python出现的时间
python出现即发行时间是在1991年。Python是一种广泛使用的解释型、高级编程、通用型编程语言,由吉多·范罗苏姆创造,第一版发布于1991年。可以视之为一种改良(加入一些其他编程语言的优点
发布时间:2021-05-24
-
Python爬虫采集遇到403问题怎么办
在python写爬虫的时候,html.getcode()会遇到403禁止访问的问题,这是网站对自动化爬虫的禁止。这篇文章主要介绍了Angular2进阶之如何解决爬虫出现403问题的办法,小编觉得挺不错的,现在分享给大
发布时间:2020-02-16
-
Python数据结构与算法中的队列详解(1)
这篇文章主要为大家详细介绍了Python的队列,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
发布时间:2022-04-12
-
Python读取xlsx数据生成图标代码实例
这篇文章主要介绍了Python读取xlsx数据生成图标代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
发布时间:2021-05-09
-
python获取当前文件夹下所有文件名方法步骤
这篇文章主要给大家介绍了关于python如何获取当前文件夹下所有文件名的相关资料,文中给出了详细的示例代码,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看
发布时间:2020-02-11
-
python如何实现网站用户名密码自动登录
最近接到这样的需求通过网页用户认证登录实现上网,如何实现网站自动登录功能呢,接下来小编给大家带来了python实现网站用户名密码自动登录功能,需要的朋友可以参考下
发布时间:2021-05-25
-
python中urlparse模块用法实例介绍
这篇文章主要给大家介绍了关于python中urlparse模块介绍与使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面随着小编来
发布时间:2019-09-05
-
利用Python读取txt文档的方法讲解
为网友们分享了关于Python的教程,今天小编就为大家分享一篇利用Python读取txt文档的方法讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
发布时间:2022-06-21