首页 > 编程知识 正文

getattr类的方法参数不匹配,获取类对象的方式

时间:2023-05-05 00:25:42 阅读:160376 作者:4873

你已经知道Python函数是对象了。 您不知道的是,使用getattr函数可以获得对在运行时之前不知道其名称的函数的引用。

示例4.10.getattr介绍li=[ '闪亮猫',' curly ' ] Li.pop1built-inmethodpopoflistobjectat 010 df 884 getattr (Li,' pop ' )2bury clear ' (4built-inmethodclearofdictionaryobjectat 00 f 113 D4 getattr (),' pop ' )5traceback ) innnermostlast ) 3360文件附件

此语句获取列表中pop方法的引用。 请注意,此语句并不调用pop方法; 我想调用pop方法是li.pop ()。 这里是指方法对象本身。 此语句也是返回pop方法的引用,但在这种情况下,方法名称将作为字符串参数传递给getattr函数。 getattr是一个不可信的内置函数,可以返回任何对象的任何属性。 在本例中,对象是list,属性是pop方法。 如果你不确定它有多么有用,试试这个。 getattr的返回值是方法。 然后,可以调用Li.append ' '直接使用。 但实际上没有直接调用函数; 我只是将函数名称指定为字符串。 getattr也作用于词典。 理论上,getattr可以作用于元组,但元组没有办法,因此指定任何属性名称getattr都会引发异常。 4.4.1 .模块使用的getattr getattr不仅可以用于内置数据类型,也可以用于模块。

示例4.11.apihelper.py中的getattr函数importodbchelperodbchelper.buildconnectionstringat 00 d 18dd4geta nctionbuildconnectionstringat 00 d 18dd4object=odbchelpermethod=' buildconnectionstring ' geta ang method ) 3功能(object,method )4type'function'importtype ) gethod ) )。 method (==types.functiontypetruecallable (getattr ) object,method ) )5 True

此语句返回对odbchelper模块的buildConnectionString函数的引用。 第二章的第一个Python程序学习了这个方法。 你看到的这个十六进制地址是我机器的; 你的输出结果不一样。 ) getattr允许您获得相同函数的相同引用。 通常,getattr(object,' attribute ' )等效于object.attribute。 如果object是模块,则属性可能是在模块中定义的

东西:函数、类或者全局变量。接下来的是你真正用在 info 函数中的东西。object 作为一个参数传递给函数; method 是方法或者函数的名称字符串。在这个例子中,method 是函数的名称,通过获取 type 可以进行验证。由于 method 是一个函数,所以它是可调用的。 4.4.2. getattr 作为一个分发者

getattr 常见的使用模式是作为一个分发者。举个例子,如果你有一个程序可以以不同的格式输出数据,你可以为每种输出格式定义各自的格式输出函数,然后使用唯一的分发函数调用所需的格式输出函数。

例如,让我们假设有一个以 HTML、XML 和普通文本格式打印站点统计的程序。输出格式在命令行中指定,或者保存在配置文件中。statsout 模块定义了三个函数:output_html、output_xml 和 output_text。然后主程序定义了唯一的输出函数,如下:

例 4.12. 使用getattr 创建分发者 import statsout def output(data, format="text"): 1 output_function = getattr(statsout, "output_%s" % format) 2 return output_function(data) 3
output 函数接收一个必备参数 data,和一个可选参数 format。如果没有指定 format 参数,其缺省值是 text 并完成普通文本输出函数的调用。你可以连接 format 参数值和 "output_" 来创建一个函数名称作为参数值,然后从 statsout 模块中取得该函数。这种方式允许今后很容易的扩展程序以支持其它的输出格式,而且无需修改分发函数。所要做的仅仅是向 statsout 中添加一个函数,比如 output_pdf,之后只要将 “pdf” 作为 format 的参数值传递给 output 函数即可。现在你可以简单的调用输出函数就像调用其它函数一样了。output_function 变量是指向 statsout 模块中相应函数的引用。

你是否发现前面示例的一个 Bug?即字符串和函数之间的松耦合,而且没有错误检查。如果用户传入一个格式参数,但是在 statsout 中没有定义相应的格式输出函数,会发生什么呢?还好,getattr 会返回 None,它会取代一个有效函数并被赋值给 output_function,然后下一行调用函数的语句将会失败并抛出一个异常。这种方式不好。

值得庆幸的是,getattr 能够使用可选的第三个参数,一个缺省返回值。

例 4.13. getattr 缺省值 import statsout def output(data, format="text"): output_function = getattr(statsout, "output_%s" % format, statsout.output_text) return output_function(data) 1
这个函数调用一定可以工作,因为你在调用 getattr 时添加了第三个参数。第三个参数是一个缺省返回值,如果第二个参数指定的属性或者方法没能找到,则将返回这个缺省返回值。

正如你所看到,getattr 是相当强大的。它是自省的核心,在后面的章节中你将看到它更强大的示例

转自:http://359611946.blog.163.com/blog/static/11619002011019102430143/

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。