python裝飾器和閉包

2021-07-04 19:54:21 字數 1641 閱讀 6863

下面幾個部落格有裝飾器的講解,也包含了裝飾器幾種情況的例子,比如說被裝飾的函式帶引數,裝飾器本身帶引數等。

理解python中的裝飾器

python裝飾器學習(例子)

其實裝飾器跟設計模式中的裝飾器模式基本一樣,就是在已有的函式上新增新的功能,這也是自己對裝飾器的一點簡陋的理解了。

下面是自己寫的簡單例子,不含引數的

用來顯示函式被呼叫的時間

from time import ctime,sleep

defshowtime

(func):

def():

print('[%s] %s() called' % (ctime(),func.__name__))

return func()

@showtime

defa

():pass

a()sleep(4)

for i in range(2):

a()sleep(1)

下面的例子展示了帶引數的裝飾器,用來記錄使用者呼叫函式的日誌,使用者可以選擇在函式呼叫前或者後,根據裝飾器的引數而定

from time import time

deflogged

(when):

deflog

(f,*args,**kargs):

print('''called:

function: %s

args: %r

kargs: %r''' % (f,args,kargs))

defpre_logged

(f):

def(*args,**kargs):

log(f,*args,**kargs)

return f(*args,**kargs)

defpost_logged

(f):

def(*args,**kwargs):

now=time()

try:

return f(*args,**kwargs)

finally:

log(f,*args,**kwargs)

print('time delta: %s' % (time()-now))

try:

return [when]#以when為鍵返回值

except keyerror as e:

raise valueerror(e,'must be "pre" or "post"')

@logged('post')

defhello

(name):

for x in range(100000):

pass

print('hello ',name)

hello(('world!',123,4.56))

還測試了一下函式的可變長引數

def

a(a,*args):

for x in args:

print(x)

a=[1,2,3]

b=a(1,*(1,2,3))

#output

#1#2

#3a(1,(1,2,3))

#output

#(1,2,3)

可見*的作用

python閉包和裝飾器

要理解裝飾器,就要明白閉包 要明白閉包,首先就要從高階函式和作用域說起 說道作用域,一般會談到legb規則。所謂的legb l locals,當前命名空間 區域性作用域 e enclosing,外部函式的命名空間 外部作用域 g global,全域性的命名空間 b bulit in,內建的命名空間平...

python 閉包和裝飾器

閉包的寫法,兩層函式的巢狀,外部函式返回內部函式的引用,外層函式都帶引數 def 外層函式的名稱 引數 def 內層函式的名稱 pass return 內層函式的引用 def set fun func func 254 defcall fun nonlocal func 修改外層函式的值,並且內部函...

Python 閉包和裝飾器

裝飾器函式裝飾器 類裝飾器 functools.wraps 簡介def outer func number definner func inner number return number inner number return inner func 給外部函式複製,20傳遞給number,並返回內...