Python之裝飾器的學習

2021-10-07 16:38:31 字數 1757 閱讀 9750

在了解完閉包之後,相信大家已經對閉包這個概率已經有了一些認識,而我們下面所學的裝飾器這個知識點則是建立在閉包的基礎之上。沒有接觸過閉包的童鞋請看我的部落格(鏈結在文章底部)

首先用閉包來實現這個功能:

import time

def writelog(func):

try:

with open('log.txt', 'a', encoding = 'utf-8') as f:

# 列印引數名字

f.write(func.__name__)

f.write('\t')

# 寫入時間

f.write(time.asctime())

f.write('\n')

except exception as e:

print(e)

# 閉包

def funcout(func):

def funcin():

# 內部函式呼叫外部引數

在上面的**中,我們僅僅寫入了倆個函式的基本內容。可是假設我們要寫100個函式呢,又或者1000個函式呢,我們這個時候不可能寫100個,1000個  func1 = funcout(func1)  之類的**。那麼怎麼辦呢,答案當然是用裝飾器來解決這個問題。

import time

def writelog(func):

try:

with open('log.txt', 'a', encoding = 'utf-8') as f:

# 列印引數名字

f.write(func.__name__)

f.write('\t')

# 寫入時間

f.write(time.asctime())

f.write('\n')

except exception as e:

print(e)

# 閉包

def funcout(func):

def funcin():

# 內部函式呼叫外部引數

writelog(func)

func()

return funcin

@funcout

def func1():

print('my name is a')

@funcout

def func2():

print('my name is b')

# func1 = funcout(func1)

# func2 = funcout(func2)

func1()

func2()

我們發現,修改後的**僅僅多了倆個@funcout,這個的作用就和func2 = funcout(func2)的作用一樣。執行,會發現依舊可以實現功能。

閉包的鏈結: 

python之裝飾器的學習

遇到問題 1 函式帶括號與不帶括號的區別 加括號是執行函式 呼叫的是函式的return結果 不加括號是函式索引 呼叫的是函式本身 2 函式中 args和 kwargs所代表的意義 python函式中 args和 kwargs是用來傳遞變長引數的用法。單星號形式 args 用來傳遞非命名鍵可變引數列表...

Python之裝飾器學習筆記

裝飾器本質上是乙個python函式,其返回值也是乙個函式物件 作用 不修改原函式情況下,為已有函式新增新的功能。如插入日誌 效能測試 事務處理 快取 許可權校驗等場景。閉包函式 在函式內部定義乙個內嵌函式,內嵌函式引用了外部函式的變數,此時內嵌函式稱為閉包函式。閉包函式所引用的外部定義的變數被叫做自...

python學習筆記之裝飾器

def print msg print msg是外函式 msg i m 狂師 defprinter printer是巢狀函式 print msg return printer 返回巢狀函式printerdef func a,b def line n nonlocal a nonlocal用於宣告變數...