深入淺出學習python裝飾器
之前就了解到了裝飾器, 但是就會點皮毛, 而且對其調(diào)用方式感到迷茫,正好現(xiàn)在的項目我想優(yōu)化,就想到了用裝飾器, 因此深入研究了下裝飾器.
先看下代碼:
import time
# 將函數(shù)作為參數(shù)傳入到此方法....
def timeif(func):
def wrapper(arg):
print("in wrapper() %s" % (arg))
start = time.clock()
func(arg)
end = time.clock()
print("used: %s %s" % (end-start, arg))
return wrapper
@timeif
def foo(arg):
print("in foo() %s" % (arg))
if __name__ == '__main__':
foo(" Hello ") # 表示執(zhí)行foo函數(shù)....
我的疑惑就是明明return 的是一個函數(shù)名,按道理來講,返回的就是一個函數(shù)地址啊!我理解有問題?隨后上網(wǎng)查資料,又是閉包....但是我個人對它不感冒,隨后自己分析,總結(jié)出了一段程序,看完你就知道原因了.
程序:
# coding=utf-8
# 帶參數(shù)的函數(shù) 返回一個函數(shù)地址就行....
def funX(x):
def funY():
return x
return funY
# 不帶參數(shù)的函數(shù)....
def funX1():
print("調(diào)用函數(shù)funX1")
def funY1():
print("調(diào)用函數(shù)funY1")
return funY1
if __name__ == '__main__':
# print(funX(5)()) # 調(diào)用有參數(shù)的嵌套函數(shù)...
print(funX1()()) # 調(diào)用無參數(shù)的嵌套函數(shù)...
這和我們的裝飾器不像嗎?這就是我們的裝飾器!因此,我們可以按照上面的程序來理解,也就是說它是首先確定參數(shù)個數(shù),隨后分別傳入的,下面,我們來改寫代碼:
# coding=utf-8
import time
# 將函數(shù)作為參數(shù)傳入到此方法....
def timeif(func):
def wrapper(arg):
print("in wrapper() %s" % (arg))
start = time.clock()
func(arg)
end = time.clock()
print("used: %s %s" % (end-start, arg))
return wrapper
# @timeif
def foo(arg):
print("in foo() %s" % (arg))
if __name__ == '__main__':
timeif(foo)(' Hello')


以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于Django的樂觀鎖與悲觀鎖解決訂單并發(fā)問題詳解
這篇文章主要介紹了基于Django的樂觀鎖與悲觀鎖解決訂單并發(fā)問題詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-07-07
python創(chuàng)建Flask Talisman應(yīng)用程序的步驟詳解
Flask是一個功能強大的Web框架,主要用于使用Python語言開發(fā)有趣的Web應(yīng)用程序,Talisman基本上是一個Flask擴展,用于添加HTTP安全標頭我們的Flask應(yīng)用程序易于實施,本文就給大家講講帶Talisman的Flask安全性,需要的朋友可以參考下2023-09-09
使用OpenCV-python3實現(xiàn)滑動條更新圖像的Canny邊緣檢測功能
這篇文章主要介紹了使用OpenCV-python3實現(xiàn)滑動條更新圖像的Canny邊緣檢測功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12
解決Python調(diào)用df.to_csv()出現(xiàn)中文亂碼的問題
在Python使用df.to_csv()時,若出現(xiàn)中文亂碼,可通過加入?yún)?shù)encoding="utf_8_sig"解決,"utf-8"編碼不包含BOM,直接處理文件時會將BOM誤讀為內(nèi)容;而"utf_8_sig"會識別并處理BOM,避免亂碼,此方法為實踐經(jīng)驗,供參考2024-09-09
java中的控制結(jié)構(gòu)(if,循環(huán))詳解
這篇文章簡單地介紹了java中的控制結(jié)構(gòu)(if,循環(huán))文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,下面我們來學習下吧2019-06-06

