getattr函數(shù)
(1)使用 getattr 函數(shù),可以得到一個(gè)直到運(yùn)行時(shí)才知道名稱的函數(shù)的引用。
>>> li = ["Larry", "Curly"]>>> li.pop<built-in method pop of list object at 0x7fb75c255518>// 該語(yǔ)句獲取列表的 pop 方法的引用,注意該語(yǔ)句并不是調(diào)用 pop 方法,調(diào)用 pop 方法的應(yīng)該是 li.pop(), 這里指的是方法對(duì)象本身。>>> getattr(li, "pop")<built-in method pop of list object at 0x7fb75c2556c8>// 該語(yǔ)句也是返回 pop 方法的引用,但是此時(shí),方法名稱是作為一個(gè)字符串參數(shù)傳遞給 getattr 函數(shù)的, getattr 是一個(gè)有用到令人無(wú)法致信的內(nèi)置函數(shù),可以返回任何對(duì)象的任何屬性。在這個(gè)例子中,對(duì)象是一個(gè) list, 屬性是 pop 方法。>>> getattr(li, "append")("Moe")>>> li['Larry', 'Curly', 'Moe']// 如果不確信它是多么的有用,試試這個(gè): getattr 的返回值是 方法, 然后你就可以調(diào)用它,就像直接使用 li.append("Moe") 一樣, 但是實(shí)際上你沒有直接調(diào)用函數(shù), 只是以字符串形式指定了函數(shù)名稱。>>> 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 都會(huì)引發(fā)一個(gè)異常。(2)用于模塊的 getattr : getattr不僅僅適用于內(nèi)置數(shù)據(jù)類型,也可作用于模塊。
// 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>// 該語(yǔ)句返回 odbchelper 模塊中 buildConnectionString 函數(shù)的引用>>> getattr(odbchelper, "buildConnectionString")<function buildConnectionString at 0x7fb75c26e848>// 使用 getattr, 你能夠獲得同一函數(shù)的同一引用, 通常, getattr(object," attribute ")等價(jià)于 object.attribute, 如果 object 是一個(gè)模塊的話,那么 attribute 可能是定義在模塊中的任何東西:函數(shù)、類或者全局變量。>>> object = odbchelper>>> method = "buildConnectionString">>> getattr(object, method)<function buildConnectionString at 0x7fb75c26e848>// object 作為一個(gè)參數(shù)傳遞給函數(shù), method 是方法或者函數(shù)的名稱字符串。>>> type(getattr(object, method))<type 'function'>>>> import types>>> type(getattr(object, method)) == types.FunctionTypeTrue// method 是函數(shù)的名稱,通過獲取 type 可以進(jìn)行驗(yàn)證。>>> callable(getattr(object, method))True// 由于 method 是一個(gè)函數(shù), 所以它是可調(diào)用的。
新聞熱點(diǎn)
疑難解答
圖片精選