摘要:作用域閉包裝飾器話聊下篇作用域閉包裝飾器的基礎(chǔ)篇,請(qǐng)看作用域閉包裝飾器話聊上篇我經(jīng)??吹接腥说难b飾器是帶參數(shù)的,這又是咋回事呢這個(gè)其實(shí)很簡(jiǎn)單的,你還記得上次我說相當(dāng)于那么相當(dāng)于也就是說,返回的是一個(gè)裝飾器函數(shù),然后再去裝飾其他函數(shù)。
Python Enclosing作用域、閉包、裝飾器話聊下篇
Python Enclosing作用域、閉包、裝飾器的基礎(chǔ)篇,請(qǐng)看Python Enclosing作用域、閉包、裝飾器話聊上篇
Jaglawz: 我經(jīng)??吹接腥说难b飾器是帶參數(shù)的,這又是咋回事呢?
Pylego: 這個(gè)其實(shí)很簡(jiǎn)單的,你還記得上次我說:
@deco def foo(): pass # 相當(dāng)于: foo = deco(foo) # 那么 @new_deco(*args, **kwargs) def bar(): pass # 相當(dāng)于: bar = new_deco(*args, **kwargs)(bar)
Jaglawz: 也就是說,new_deco返回的是一個(gè)裝飾器函數(shù),然后再去裝飾其他函數(shù)。那類裝飾器又是怎么回事呢?
Pylego: 你知道Python的對(duì)象可以像函數(shù)一樣調(diào)用嗎?
from hashlib import sha256 class HashCache(object): def __init__(self): self.cache = {} def __call__(self, string): if string not in self.cache: self.cache[string] = sha256(string).hexdigest() return self.cache[string] hc = HashCahce() hc("foo") # 像函數(shù)一樣調(diào)用hc對(duì)象 hc("foo") hc("bar")
Jaglawz: 如果是這樣的話我就明白了。
class FibCache(object): def __init__(self, func): self.func = func self.cache = {} def __call__(self, n): if n not in self.cache: self.cache[n] = self.func(n) return self.cache[n] @FibCache def fib(n): if n == 0: return 0 elif n == 1: return 1 else: return fib(n-1) + fib(n-2) # 相當(dāng)于: fib = FibCache(fib) # fib(10)相當(dāng)于FibCache(fib)(10) # 裝飾后的fib是FibCache的一個(gè)對(duì)象而已 # 也就是說作為裝飾器的類的構(gòu)造方法要接收一個(gè)待裝飾的函數(shù),然后__call__函數(shù)的參數(shù)要和待裝飾的函數(shù)的參數(shù)是一樣的(除了self),這樣的類就可以用來裝飾函數(shù)了
Pylego: 你這個(gè)裝飾器厲害,還給fibnacci函數(shù)加了緩存,佩服!
Jaglawz: 我不會(huì)告訴你我是看了大神的杰作然后嚇嚇唬嚇唬你的!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/45504.html
摘要:作用域閉包裝飾器話聊上篇聽講一切都是對(duì)象,是嗎是的,像函數(shù)也是對(duì)象。不錯(cuò)嘛這都被你看出來了,那你知道作用域的原則嗎我知道是知道可以我就是對(duì)那個(gè)作用域不是很理解。如果內(nèi)部函數(shù)引用到外層函數(shù)作用域的對(duì)象,這個(gè)內(nèi)部函數(shù)就稱為閉包。 Python Enclosing作用域、閉包、裝飾器話聊上篇 Jaglawz: 聽講Python一切都是對(duì)象,是嗎? Pylego: 是的,像函數(shù)也是對(duì)象。 Ja...
摘要:在計(jì)算機(jī)科學(xué)中,閉包又稱詞法閉包或函數(shù)閉包,是引用了自由變量的函數(shù)。閉包被廣泛應(yīng)用于函數(shù)式語言中。運(yùn)用閉包可以避免對(duì)全局變量的使用。將棧頂?shù)脑厝〕?,?chuàng)建元組,并將該元組進(jìn)棧。 在計(jì)算機(jī)科學(xué)中,閉包 又稱 詞法閉包 或 函數(shù)閉包,是引用了自由變量的函數(shù)。這個(gè)被引用的自由變量將和這個(gè)函數(shù)一同存在,即使已經(jīng)離開了創(chuàng)造它的環(huán)境也不例外。閉包被廣泛應(yīng)用于函數(shù)式語言中。 從上面這段話中可以看出閉...
摘要:變量查找規(guī)則在中一個(gè)變量的查找順序是局部環(huán)境,閉包,全局,內(nèi)建閉包引用了自由變量的函數(shù)。閉包的作用閉包的最大特點(diǎn)是可以將父函數(shù)的變量與內(nèi)部函數(shù)綁定,并返回綁定變量后的函數(shù),此時(shí)即便生成閉包的環(huán)境父函數(shù)已經(jīng)釋放,閉包仍然存在。 導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之函數(shù)篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握裝飾器的本質(zhì)、功...
摘要:迭代器迭代是訪問集合元素的一種方式。迭代器是一個(gè)可以記住遍歷的位置的對(duì)象,迭代器對(duì)象從集合的第一個(gè)元素開始訪問,直到所有的元素被訪問完結(jié)束,迭代器只往前不會(huì)往后退。生成器特點(diǎn)保存了一套生成數(shù)值的算法。 迭代器 迭代是訪問集合元素的一種方式。迭代器是一個(gè)可以記住遍歷的位置的對(duì)象,迭代器對(duì)象從集合的第一個(gè)元素開始訪問,直到所有的元素被訪問完結(jié)束,迭代器只往前不會(huì)往后退。 可迭代對(duì)象 以直接...
摘要:在嵌套函數(shù)中訪問了最外層函數(shù)的參數(shù),結(jié)果我們是能正常訪問閉包我們將上面的最外層的返回值修改為返回嵌套函數(shù)的引用一切皆對(duì)象根據(jù)前面變量生存期例子,按理說調(diào)用完的生命周期應(yīng)該結(jié)束了,調(diào)用應(yīng)該失敗才對(duì),但是實(shí)際卻調(diào)用成功了。 復(fù)習(xí) python引用變量的順序: 當(dāng)前作用域局部變量 -> 外層作用域變量 -> 當(dāng)前模塊中的全局變量 -> python內(nèi)置變量 global:聲明一個(gè)全局變量 n...
閱讀 1586·2021-11-25 09:43
閱讀 2489·2019-08-30 15:54
閱讀 2953·2019-08-30 15:53
閱讀 1104·2019-08-30 15:53
閱讀 761·2019-08-30 15:52
閱讀 2553·2019-08-26 13:36
閱讀 824·2019-08-26 12:16
閱讀 1222·2019-08-26 12:13