閉包 裝飾器

2022-03-05 13:43:21 字數 2670 閱讀 3505

內部函式包含對外部作用域而非全劇作用域名字的引用,該內部函式稱為閉包函式

判斷是否是閉包函式  ___closure___     有cell  即閉包函式    none  則不是

#輸出的__closure__有cell元素 :是閉包函式

def func():

name = 'a'

def inner():

print(name)

print(inner.__closure__)

return inner

f = func()

f()#輸出的__closure__為none :不是閉包函式

name = 'aa'

def func2():

def inner():

print(name)

print(inner.__closure__)

return inner

f2 = func2()

f2()

def func():

name = 'a'

def inner():

print(name)

return

inner

f =func()

print(f)

f()

簡單閉包

裝飾器的本質:乙個閉包函式

裝飾器的功能:在不修改原函式及其呼叫方式的情況下對原函式功能進行擴充套件

import time

def inner(*args, **kwargs):

start =time.time()

ret = func(*args, **kwargs)

end =time.time()

print(end -start)

return

ret

return

inner

def func():

time.sleep(1)

print(

111)

print(func())

計算時間

檢視函式的相關資訊

def index():

'''這是乙個主頁資訊

'''print(

'from index')

print(index.__doc__) #檢視函式注釋的方法

print(index.__name__) #檢視函式名的方法

避免  檢視函式的一些資訊的方法在此處失效

from

functools import wraps

def deco(func):

@wraps(func)

print(

'函式之前的裝飾')

ret = func(*args, **kwargs)

print(

'函式之後的裝飾')

return

ret

return

@deco

def func():

'''函式的注釋資訊

'''print('函式

')print(func())

print(func.__name__)

print(func.__doc__)

開放封閉原則:

任何乙個程式,都應該對拓展是開放的,對修改是封閉的

裝飾器固定格式

def timer(func):

def inner(*args,**kwargs):

'''執行函式之前要做的

'''re = func(*args,**kwargs)

'''執行函式之後要做的

'''return

re

return inner

多個裝飾器裝飾乙個函式

def inner():

print(''

) func()

print(''

)

return

inner

def inner():

print(''

) func()

print(''

)

return

inner

def f():

print(

'in f')

f()裝飾器

帶引數的裝飾器

def outer(flag):

def inner(*args, **kwargs):

ifflag:

print(

'''執行函式之前要做的

''')

re = func(*args, **kwargs)

ifflag:

print(

'''執行函式之後要做的

''')

return

re

return

inner

return

@outer(true)

def func():

print(

'111')

return

'aaa

'print(func())

閉包 裝飾器

外部函式返回內部函式的引用 內部函式可以直接使用外部函式的環境變數 語法 外部函式通過返回內部函式的引用 內部函式可以直接使用外部函式的 環境變數 自由變數 函式執行時間統計 執行函式前預備處理 執行函式後清理功能 許可權校驗等場景 快取有且只有乙個引數 指向了被裝飾的函式的引用 使用裝飾器 裝飾器...

閉包,裝飾器

多層函式巢狀,函式裡面還有定義函式,一般是兩個 往往內層函式會用到外層函式的變數,把內層函式以及外部函式的變數當成乙個特殊的物件,這就是閉包。閉包比物件導向更純淨 更輕量,既有資料又有執行資料的 比普通函式功能更強大,不僅有 還有資料 利用閉包的基本原理,對乙個目標函式進行裝飾,即在執行乙個目標函式...

閉包 裝飾器

定義乙個函式 def test number 在函式內部再定義乙個函式,並且這個函式用到了外邊函式的變數,那麼將這個函式及用到的一些變數稱之為閉包 def test in number in print in text in 函式,number in is d number in return nu...