全部博文(921)
分类: Python/Ruby
2011-06-08 18:31:01
该语句也是返回 pop 方法的引用,但是此时,方法名称是作为一个字符串参数传递给 getattr 函数的。getattr 是一个有用到令人无法致信的内置函数,可以返回任何对象的任何属性。在这个例子中,对象是一个 list,属性是 pop 方法。
如果不确信它是多么的有用,试试这个:getattr 的返回值是 方法,然后你就可以调用它,就像直接使用 li.append("Moe") 一样。但是实际上你没有直接调用函数;只是以字符串形式指定了函数名称。
理论上,getattr 可以作用于元组,但是由于元组没有方法,所以不管你指定什么属性名称 getattr 都会引发一个异常。getattr 不仅仅适用于内置数据类型,也可作用于模块。
apihelper.py 中的 getattr 函数





|
该语句返回 odbchelper 模块中 buildConnectionString 函数的引用,第 2 章 第一个 Python 程序 你已经研习过这个方法了。(你看到的这个十六进制地址是我机器上的;你的输出结果会有所不同。) |
|
使用 getattr,你能够获得同一函数的同一引用。通常,getattr(object, "attribute") 等价于 object.attribute。如果 object 是一个模块的话,那么 attribute 可能是定义在模块中的任何东西:函数、类或者全局变量。 |
|
接下来的是你真正用在 info 函数中的东西。object 作为一个参数传递给函数; method 是方法或者函数的名称字符串。 |
|
在这个例子中,method 是函数的名称,通过获取 type 可以进行验证。 |
|
由于 method 是一个函数,所以它是可调用的。
|
例如,让我们假设有一个以 HTML、XML 和普通文本格式打印站点统计的程序。输出格式在命令行中指定,或者保存在配置文件中。statsout 模块定义了三个函数:output_html、output_xml 和 output_text。然后主程序定义了唯一的输出函数,如下:
使用getattr 创建分发者



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