首页 > 编程 > Python > 正文

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

2020-02-16 00:47:56
字体:
来源:转载
供稿:网友

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.pydef 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.FunctionTypeTrue// method 是函数的名称,通过获取 type 可以进行验证。>>> callable(getattr(object, method))True// 由于 method 是一个函数, 所以它是可调用的。            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表