首页 > 深入Python > 自省的威力 > 使用 getattr 得到对象的引用 | << >> | ||||
diveintopython.org Python for experienced programmers |
你已经知道Python函数是对象。你不知道的是,使用 getattr 函数,你可以得到一个直到运行时才知道的函数的引用。
>>> li = ["Larry", "Curly"] >>> li.pop <built-in method pop of list object at 010DF884> >>> getattr(li, "pop") <built-in method pop of list object at 010DF884> >>> getattr(li, "append")("Moe") >>> li ["Larry", "Curly", "Moe"] >>> getattr({}, "clear") <built-in method clear of dictionary object at 00F113D4> >>> getattr((), "pop") Traceback (innermost last): File "<interactive input>", line 1, in ? AttributeError: 'tuple' object has no attribute 'pop'
这样得到列表的 pop 方法的一个引用。注意这样不是调用 pop 方法,调用应是 li.pop()。它是方法本身。 |
|
这样也返回 pop 方法的引用,但这次,方法的名字被指定为 getattr 函数的一个字符串参数。 getattr 是一个相当有用的内置函数,它可以返回任意对象的任意属性。在本例中,对象是列表,属性是 pop 方法。 |
|
如果不深信它是多么的有用,试试这个:getattr 的返回值是方法,接着你可以调用它就好象直接调用 li.append("Moe")。但是你没有直接调用函数,而是以字符串的形式来指定函数名。 | |
getattr 也可以用于字典。 | |
在理论上,getattr 应可以用于元组,除了元组没有方法,所以不管给出什么属性名, getattr 都将引发一个异常。 |
getattr 不只适用于内置数据类型。它也可用于模块。
例 2.12. getattr 用于 apihelper.py
>>> import odbchelper >>> odbchelper.buildConnectionString <function buildConnectionString at 00D18DD4> >>> getattr(odbchelper, "buildConnectionString") <function buildConnectionString at 00D18DD4> >>> object = odbchelper >>> method = "buildConnectionString" >>> getattr(object, method) <function buildConnectionString at 00D18DD4> >>> type(getattr(object, method)) <type 'function'> >>> import types >>> type(getattr(object, method)) == types.FunctionType 1 >>> callable(getattr(object, method)) 1
它返回在 odbchelper 模块中的 buildConnectionString 函数的引用, odbchelper 模块我们在开始了解Python中学过了。(你看到的16进制地址是专对我的机器的;你的输出将有所不同。) |
|
使用 getattr,我们可以得到同一函数的同一引用。通常, getattr(object, "attribute") 相当于 object.attribute。如果 object 是一个模块,那么 attribute 可以是定义在模块中的任何东西:一个函数,类,或全局变量。 |
|
并且这个就是我们真正用在 help 函数中的东西。object 作为一个参数被传到函数中;method 是一个字符串,这个字符串是方法或函数的名字。 | |
在本例中,method 是函数的名字,这一点我们可以通过得到它的类型来证实。 | |
因为 method 是一个函数,它是可调用的。 |
type, str, dir, 和其它内置函数 |
1 2 3 4 5 6 7 8 9 |
过滤列表 |