摘要:作用域閉包裝飾器話聊下篇作用域閉包裝飾器的基礎篇,請看作用域閉包裝飾器話聊上篇我經常看到有人的裝飾器是帶參數的,這又是咋回事呢這個其實很簡單的,你還記得上次我說相當于那么相當于也就是說,返回的是一個裝飾器函數,然后再去裝飾其他函數。
Python Enclosing作用域、閉包、裝飾器話聊下篇
Python Enclosing作用域、閉包、裝飾器的基礎篇,請看Python Enclosing作用域、閉包、裝飾器話聊上篇
Jaglawz: 我經常看到有人的裝飾器是帶參數的,這又是咋回事呢?
Pylego: 這個其實很簡單的,你還記得上次我說:
@deco def foo(): pass # 相當于: foo = deco(foo) # 那么 @new_deco(*args, **kwargs) def bar(): pass # 相當于: bar = new_deco(*args, **kwargs)(bar)
Jaglawz: 也就是說,new_deco返回的是一個裝飾器函數,然后再去裝飾其他函數。那類裝飾器又是怎么回事呢?
Pylego: 你知道Python的對象可以像函數一樣調用嗎?
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") # 像函數一樣調用hc對象 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) # 相當于: fib = FibCache(fib) # fib(10)相當于FibCache(fib)(10) # 裝飾后的fib是FibCache的一個對象而已 # 也就是說作為裝飾器的類的構造方法要接收一個待裝飾的函數,然后__call__函數的參數要和待裝飾的函數的參數是一樣的(除了self),這樣的類就可以用來裝飾函數了
Pylego: 你這個裝飾器厲害,還給fibnacci函數加了緩存,佩服!
Jaglawz: 我不會告訴你我是看了大神的杰作然后嚇嚇唬嚇唬你的!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45504.html
摘要:作用域閉包裝飾器話聊上篇聽講一切都是對象,是嗎是的,像函數也是對象。不錯嘛這都被你看出來了,那你知道作用域的原則嗎我知道是知道可以我就是對那個作用域不是很理解。如果內部函數引用到外層函數作用域的對象,這個內部函數就稱為閉包。 Python Enclosing作用域、閉包、裝飾器話聊上篇 Jaglawz: 聽講Python一切都是對象,是嗎? Pylego: 是的,像函數也是對象。 Ja...
摘要:在計算機科學中,閉包又稱詞法閉包或函數閉包,是引用了自由變量的函數。閉包被廣泛應用于函數式語言中。運用閉包可以避免對全局變量的使用。將棧頂的元素取出,創建元組,并將該元組進棧。 在計算機科學中,閉包 又稱 詞法閉包 或 函數閉包,是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即使已經離開了創造它的環境也不例外。閉包被廣泛應用于函數式語言中。 從上面這段話中可以看出閉...
摘要:變量查找規則在中一個變量的查找順序是局部環境,閉包,全局,內建閉包引用了自由變量的函數。閉包的作用閉包的最大特點是可以將父函數的變量與內部函數綁定,并返回綁定變量后的函數,此時即便生成閉包的環境父函數已經釋放,閉包仍然存在。 導語:本文章記錄了本人在學習Python基礎之函數篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。 本文重點: 1、掌握裝飾器的本質、功...
摘要:迭代器迭代是訪問集合元素的一種方式。迭代器是一個可以記住遍歷的位置的對象,迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束,迭代器只往前不會往后退。生成器特點保存了一套生成數值的算法。 迭代器 迭代是訪問集合元素的一種方式。迭代器是一個可以記住遍歷的位置的對象,迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束,迭代器只往前不會往后退。 可迭代對象 以直接...
摘要:在嵌套函數中訪問了最外層函數的參數,結果我們是能正常訪問閉包我們將上面的最外層的返回值修改為返回嵌套函數的引用一切皆對象根據前面變量生存期例子,按理說調用完的生命周期應該結束了,調用應該失敗才對,但是實際卻調用成功了。 復習 python引用變量的順序: 當前作用域局部變量 -> 外層作用域變量 -> 當前模塊中的全局變量 -> python內置變量 global:聲明一個全局變量 n...
閱讀 1578·2021-11-25 09:43
閱讀 2482·2019-08-30 15:54
閱讀 2946·2019-08-30 15:53
閱讀 1094·2019-08-30 15:53
閱讀 754·2019-08-30 15:52
閱讀 2545·2019-08-26 13:36
閱讀 813·2019-08-26 12:16
閱讀 1216·2019-08-26 12:13