閉包,裝飾器,帶參數(shù)的裝飾器

閉包

由于閉包引用了外部函數(shù)的局部變量,則外部函數(shù)的局部變量沒(méi)有及時(shí)釋放,消耗內(nèi)存

x = 300

def test1():

? ? x=200

? ? def test2():

? ? ? ? # global x

? ? ? ? nonlocal x

? ? ? ? print('---1---x=%d'%x)

? ? ? ? x=100

? ? ? ? print('---2---x=%s'%x)

? ? return test2

t1 = test1()

t1()

裝飾器

裝飾器就是用于拓展函數(shù)功能的一種函數(shù),它的特殊之處,在于它的返回值也是一個(gè)函數(shù),使用裝飾器的好處就是,在不用更改原函數(shù)代碼的前提下,給函數(shù)增加新的功能

def outside1(test):

? ? print('執(zhí)行了裝飾器外部函數(shù)1')

? ? def inside(*args,**kwargs):

? ? ? ? print('welcome1')

? ? ? ? return test(*args,**kwargs)

? ? return inside

def outside2(test):

? ? print('執(zhí)行了裝飾器外部函數(shù)2')

? ? def inside(*args,**kwargs):

? ? ? ? print('welcome2')

? ? ? ? return test(*args,**kwargs)

? ? return inside

@outside1

@outside2

def func(*args,**kwargs):

? ? print(kwargs)

? ? # print(*args,**kwargs)

? ? # print('hello world')

#

# a = outside1(func)

# a()

func(a=1,b=2)

帶參數(shù)的裝飾器

def set_level(level_num):

? ? def set_func(func):

? ? ? ? def call_func(*args,**kwargs):

? ? ? ? ? ? if level_num == 1:

? ? ? ? ? ? ? ? print('---權(quán)限級(jí)別1,驗(yàn)證---')

? ? ? ? ? ? elif level_num == 2:

? ? ? ? ? ? ? ? print('---權(quán)限級(jí)別2,驗(yàn)證---')

? ? ? ? ? ? elif level_num == 10:

? ? ? ? ? ? ? ? print('---權(quán)限級(jí)別10,驗(yàn)證---')

? ? ? ? ? ? return func()

? ? ? ? return call_func

? ? return set_func

@set_level(10)

def test1():

? ? print('---test1---')

? ? return 'ok'

@set_level(2)

def test2():

? ? print('---test2---')

? ? return 'ok'

test1()

test2()

# 1、調(diào)用set_func并且將1當(dāng)做實(shí)參傳遞

# 2、用上一步調(diào)用的返回值,當(dāng)做裝飾器對(duì)test1函數(shù)進(jìn)行裝飾

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容