在Python中通过getattr获取对象引用的方法

作者:HP的博客 时间:2023-08-24 23:32:33 

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 模块中相应函数的引用。

来源:https://blog.csdn.net/Oscer2016/article/details/54572977

标签:Python,getattr,对象,引用
0
投稿

猜你喜欢

  • 总结python实现父类调用两种方法的不同

    2022-05-27 14:54:48
  • Python读取Excel表格,并同时画折线图和柱状图的方法

    2023-12-25 07:11:27
  • python2.7+selenium2实现淘宝滑块自动认证功能

    2023-06-06 14:29:34
  • Pytorch平均池化nn.AvgPool2d()使用方法实例

    2023-09-30 02:49:35
  • DBCC CHECKIDENT 重置数据库标识列从某一数值开始

    2024-01-15 11:16:27
  • 使用pycallgraph分析python代码函数调用流程以及框架解析

    2023-06-05 08:52:56
  • 三条asp语句搞定路径

    2007-10-22 13:30:00
  • sql server 2000阻塞和死锁问题的查看与解决方法

    2024-01-20 01:46:45
  • ML神器:sklearn的快速使用及入门

    2023-04-17 04:42:09
  • Linux 下 Python 实现按任意键退出的实现方法

    2022-08-07 14:22:01
  • asp如何用下拉列表显示数据库里的内容?

    2010-06-16 09:54:00
  • Python中列表、字典、元组、集合数据结构整理

    2022-08-02 05:54:57
  • python机器学习混淆矩阵及confusion matrix函数使用

    2023-03-08 18:14:12
  • sqlserver 增删改查一些不常用的小技巧

    2024-01-24 06:49:59
  • Sql Server在安装时提示挂起的解决方法

    2009-01-13 13:55:00
  • Python 平方列表中每个数字的多种操作

    2023-11-14 03:53:00
  • 利用Python批量生成任意尺寸的图片

    2021-02-14 11:20:12
  • django实现图片上传数据库并显示

    2024-01-13 08:52:24
  • python中os操作文件及文件路径实例汇总

    2023-03-20 23:54:09
  • mysql登录报错提示:ERROR 1045 (28000)的解决方法

    2024-01-24 04:54:01
  • asp之家 网络编程 m.aspxhome.com