閉包 裝飾器

2021-10-01 02:34:59 字數 3077 閱讀 2525

如何定義乙個閉包?

閉包函式必須有內嵌函式

內嵌函式必須要引用外層函式的變數

閉包函式返回內嵌函式的位址(函式名稱)

作用:在不修改原始碼 的情況下增加功能

建立乙個閉包函式:

def func():

name = 'zs'

def inner():

print(name)

return inner

f = func()

f()#zs

判斷閉包函式的方法:__closure__

def func():

name = 'ls'

def inner():

print(name)

print(inner.__closure__)#如果是閉包,會列印出如果不是,則列印none

return inner

f = func()

f()#(,)

#lsname = 'ls'

def func():

def inner():

print(name)

print(inner.__closure__)

return inner

f = func()

f()#none

#ls#因為引用的是外部變數不是外部函式的變數所有不是閉包

建立乙個計算函式執行花費時間的閉包函式

import time

#功能函式

def fun():

print('哈哈哈')

#閉包函式

def timer(func):

def inner():

start = time.time()

time.sleep(0.01)

func()#執行fun()函式

end = time.time()

print(end-start)

return inner

fun = timer(fun)

fun()

裝飾器的本質:

乙個閉包函式

裝飾器的作用:

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

語法糖:

格式:@裝飾器名稱

可以理解成裝飾器就時將乙個閉包函式使用語法糖的形式放在需要使用裝飾器的函式上

注意:裝飾器函式需要寫在功能函式的上面,因為**是從上往下執行寫在下面找不到

使用語法糖建立乙個計算函式執行花費的時間

import time

def timer(func):

def inner():

start = time.time()

time.sleep(0.01)

func()#執行fun()函式

end = time.time()

print(end-start)

return inner

@timer #語法糖:等價於fun=timer(fun)

def fun():

print('哈哈哈')

fun()

建立乙個帶返回值的裝飾器

import time

def timer(func):

def inner():

start = time.time()

time.sleep(0.01)

#2.接受返回值

ret = func()

end = time.time()

print(end-start)

#3.返回返回值

return ret

return inner

@timer

def fun():

print('哈哈哈')

#1.設定返回值

return '嘿嘿嘿'

ret = fun()

print(ret)

建立乙個帶引數的裝飾器

import time

def timer(func):

#1.傳遞引數

def inner(s):

start = time.time()

time.sleep(0.01)

#2.傳遞引數

func(s)

end = time.time()

print(end-start)

return inner

@timer

def fun(s):

print('哈哈哈',s)

fun('嘿嘿')

定義乙個可以傳遞任意引數的裝飾器

import time

def timer(func):

def inner(*args,**kwargs):

start = time.time()

time.sleep(0.01)

func(*args,**kwargs)

end = time.time()

print(end-start)

return inner

@timer

def fun(*args,**kwargs):

print(args,kwargs)

fun('嘿嘿','哈哈','呵呵',name='張三')

多個裝飾器的使用:

可以使用多個裝飾器裝飾同乙個函式,離函式近的先裝飾

def fun1(func):

def inner1():

return '《'+func()+'》'

return inner1

def fun2(func):

def inner2():

return '*'+func()+'*'

return inner2

@fun2

@fun1

def bookname():

return '大話西遊'

print(bookname())

#*《大話西遊》*

閉包 裝飾器

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

閉包,裝飾器

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

閉包 裝飾器

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