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 可能是定义在模块中的任何东西:函数、类或者html" target="_blank">全局变量。 >>> 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获取对象引用的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
4.4. 通过 getattr 获取对象引用 4.4.1. 用于模块的 getattr 4.4.2. getattr 作为一个分发者 你已经知道 Python 函数是对象。 你不知道的是,使用 getattr 函数,可以得到一个直到运行时才知道名称的函数的引用。 例 4.10. getattr 介绍 >>> li = ["Larry", "Curly"] >>> li.pop
本文向大家介绍Python通过getattr函数获取对象的属性值,包括了Python通过getattr函数获取对象的属性值的使用技巧和注意事项,需要的朋友参考一下 英文文档: getattr(object, name[, default]) Return the value of the named attribute of object. name must be a string. If th
问题内容: 例如,我有: 然后,例如,我要通过对该对象进行 排序/反转。然后我想得到这样的东西: 现在,我想知道具有属性的对象的索引,以获取属性标记的值。 我该如何解决这个问题? 问题答案: 正如其他答案所暗示的那样,遍历数组可能是最好的方法。但是我会把它放在它自己的函数中,并使它更抽象一些: 这样,您不仅可以找到包含“ John”的一个,而且可以找到包含令牌“ 312312”的一个: 编辑: 未
我想通过对象在Java中的属性来获取列表中对象的索引。 例: 现在,我想获取一个名为“Girish”的对象的索引。请务必让我知道JAVA中的代码。
本文向大家介绍Java中通过Class类获取Class对象的方法详解,包括了Java中通过Class类获取Class对象的方法详解的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要给大家介绍的是关于Java通过Class类获取Class对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 阅读API的Class类得知,Class 没有公共构造方法。Class 对象是
本文向大家介绍Python-getattr()方法,包括了Python-getattr()方法的使用技巧和注意事项,需要的朋友参考一下 当我们使用足够的python的面向对象概念进行编程时,我们需要创建对象并访问其属性。这些对象通常是从一个类创建的,而getattr函数可以帮助我们访问该对象的属性。 示例 在下面的示例中,我们从一个名为Best Buy的类中创建一个对象,并将值分配给该对象的属性。