關於python中裝飾器的一些小見解
最近在學習python3,對於python的裝飾器,多線程以及異步IO有點卡頓。這兩天在研究python的裝飾器,之前在看廖雪峰大神的裝飾器感覺一臉懵逼。轉而去看伯樂在線的裝飾器教程,這裡不是做廣告。伯樂在線的確解決挺多疑惑。仔細閱讀了很多作者的裝飾器教程,特此做個總結來加深對python的裝飾器的瞭解。
函數
在python當中函數也是可以直接作為函數參數傳給另外一個函數。在這種情況,函數也是作為一個變量,例如:
def now(func): func()def hello(): print("hello world")now(hello)#直接輸出 hello world
作用域
python函數內部定義變量,我們稱為局部變量,有人稱為命名空間。python作用域與javascript的作用域相似。函數內部定義的變量,函數外不能直接訪問(全局作用域下);如果全局作用域下與函數作用域存在同名變量,函數會優先使用函數內部變量值;若函數內部不存在這個變量,則解釋器會一層層往上訪問直至全局作用域(如果不存在,則拋出錯誤)。
1. def func(): name="kiwis" print("my name is %s"%name) func()# python shell環境1輸出 my name is kiwis
2.name ="DB"def func(): name="kiwis" print("my name is %s"%name)func()# python shell環境1輸出 my name is kiwis
3.name ="DB"def func(): print("my name is %s"%name)func()# python shell環境1輸出 my name is DB
裝飾器
裝飾器到底是什麼?為什麼要使用裝飾器?裝飾器顧名思義就是錦上添花,裝飾,為原有事物添加更好的東西。如果我們在初期定義了一個函數;但是突然之間想要知道這個函數執行了多長時間;但是又不用修改原有函數,這個時候python裝飾器派上用場。示例如下:
from datetime import datetimedef logtime(func): def runFun(*args,**kwargs): print("the start time is %s"%datetime.now()) res=func(*args, **kwargs) print("the end time is %s"% datetime.now()) return res return runFun()def add(): print("hello world")add=logtime(add())
上面add=logtime(add())在python中提供了用@標識符來表示裝飾器的語法糖,用@表示的語法其實和上面最後一句作用是一樣的。示例代碼如下:
from datetime import datetimedef logtime(func): def runFun(*args,**kwargs): print("the start time is %s"%datetime.now()) res=func(*args, **kwargs) print("the end time is %s"% datetime.now()) return res return runFun()@logtimedef add(): print("hello world")
在使用python裝飾器時,裝飾器函數返回一個函數runFun,此時add函數的name值已經不是add了,如果要改變成原來的相關變量,python中提供了functools.wrap()幫助我們完成。
from datetime import datetimedef logtime(func): @functools.wrap(func) def runFun(*args,**kwargs): print("the start time is %s"%datetime.now()) res=func(*args, **kwargs) print("the end time is %s"% datetime.now()) return res return runFun()@logtimedef add(): print("hello world")
python裝飾器有針對函數的裝飾器和對象的裝飾器。下次繼續闡述一下面對對象的裝飾器。
相關推薦
'Python中的Lambda,Map和Filter'
"今天的部分介紹了在Python中使用lambda,map和filter函數。我們將介紹每個的基本語法,並通過一些示例來熟悉使用它們。讓我們開始吧!*** Lambda***lambda運算符或lambda函數用於在Python中創建小型的、一次性的匿名函數對象基本語法la...
'Python中的Requests模塊,星號和括號'
"requests模塊官方地址:https://github.com/psf/requests官方文檔 :https://2.python-requests.org/en/master/用於http請求的模塊 ,用於網頁數據抓取七個主要方法Python資源共享群:62601...
'Python批量刪除mysql中千萬級大量數據'
"場景描述線上 mysql 數據庫裡面有張表保存有每天的統計結果,每天有1千多萬條,這是我們意想不到的,統計結果咋有這麼多。運維找過來,磁盤佔了 200G ,最後問了運營,可以只保留最近3天的,前面的數據,只能刪了。刪,怎麼刪?關注,轉發,私信小編“01”即可免費領取Pyt...
'史上最全 Python 迭代器與生成器'
"轉自:浪子燕青 http://www.langzi.fun/迭代器與生成器.html迭代器與可迭代對象概念迭代器:是訪問數據集合內元素的一種方式,一般用來遍歷數據,但是他不能像列表一樣使用下標來獲取數據,也就是說迭代器是不能返回的。Iterator:迭代器對象,必須要實現...
'如何將一個 Python 函數進行模塊化封裝'
"使用 Python 函數來最大程度地減少重複任務編碼工作量。-- Seth Kenlon(作者)你是否對函數、類、方法、庫和模塊等花哨的編程術語感到困惑?你是否在與變量作用域鬥爭?無論你是自學成才的還是經過正式培訓的程序員,代碼的模塊化都會令人困惑。但是類和庫鼓勵模塊化代...
'Python最佳工程實踐,建立一個完美的工程項目'
"在程序開發時候一套好的開發環境和工具棧,可以幫我們極大的提高開發的效率,避免把大量時間浪費在周邊瑣事上。本文以Python為例,教大家如何快速打造完美的Python項目開發環境:內容涵蓋了模塊依賴管理、代碼風格管理、調試測試管理和Git版本管理,使用git hook做項目...
'Python GUI教程(一):在PyQt5中創建第一個GUI圖形用戶界面'
"一、第一個GUI首先,我們使用pyqt5的窗口小部件創建一個最基本的GUI:# coding:utf-8import sysfrom PyQt5.QtWidgets import *app = QApplication(sys.argv)win = QWidget()wi...
推薦中...