內部函式包含對外部作用域而非全劇作用域名字的引用,該內部函式稱為閉包函式
判斷是否是閉包函式 ___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...