在Python中通过getattr获取对象引用的方法
getattr函数
(1)使用getattr函数,可以得到一个直到运行时才知道名称的函数的引用。
>>>li=["Larry","Curly"] >>>li.pop//该语句获取列表的pop方法的引用,注意该语句并不是调用pop方法,调用pop方法的应该是li.pop(),这里指的是方法对象本身。 >>>getattr(li,"pop") //该语句也是返回pop方法的引用,但是此时,方法名称是作为一个字符串参数传递给getattr函数的,getattr是一个有用到令人无法致信的内置函数,可以返回任何对象的任何属性。在这个例子中,对象是一个list,属性是pop方法。 >>>getattr(li,"append")("Moe") >>>li ['Larry','Curly','Moe'] //如果不确信它是多么的有用,试试这个:getattr的返回值是方法,然后你就可以调用它,就像直接使用li.append("Moe")一样,但是实际上你没有直接调用函数,只是以字符串形式指定了函数名称。 >>>getattr({},"clear") //getattr也可以作用于字典。 >>>getattr((),"pop") Traceback(mostrecentcalllast): File" ",line1,in AttributeError:'tuple'objecthasnoattribute'pop' //理论上,getattr可以作用于元组,但是由于元组没有方法,所以不管你指定什么属性名称getattr都会引发一个异常。
(2)用于模块的getattr:getattr不仅仅适用于内置数据类型,也可作用于模块。
//odbchelper.py defbuildConnectionString(params): """Buildaconnectionstringfromadictionaryofparameters. Returnsstring.""" return";".join(["%s=%s"%(k,v)fork,vinparams.items()]) if__name__=="__main__": myParams={"server":"mpilgrim",\ "database":"master",\ "uid":"sa",\ "pwd":"secret" } printbuildConnectionString(myParams) //end >>>importodbchelper >>>odbchelper.buildConnectionString//该语句返回odbchelper模块中buildConnectionString函数的引用 >>>getattr(odbchelper,"buildConnectionString") //使用getattr,你能够获得同一函数的同一引用,通常,getattr(object,"attribute")等价于object.attribute,如果object是一个模块的话,那么attribute可能是定义在模块中的任何东西:函数、类或者全局变量。 >>>object=odbchelper >>>method="buildConnectionString" >>>getattr(object,method) //object作为一个参数传递给函数,method是方法或者函数的名称字符串。 >>>type(getattr(object,method)) >>>importtypes >>>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,然后主程序定义了唯一的输出函数,如下:
importstatsout defoutput(data,format="text"):(1) output_function=getattr(statsout,"output_%s"%\ format,statsout.output_text)(2) returnoutput_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获取对象引用的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。