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

閉包

由于閉包引用了外部函數(shù)的局部變量,則外部函數(shù)的局部變量沒有及時(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ù),它的特殊之處,在于它的返回值也是一個函數(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)限級別1,驗(yàn)證---')

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

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

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

? ? ? ? ? ? ? ? print('---權(quán)限級別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)做裝飾器對test1函數(shù)進(jìn)行裝飾

閉包:

定義:在函數(shù)內(nèi)部再定義一個函數(shù),并且這個函數(shù)用到了外邊函數(shù)的變量,那么將這個函數(shù)以及用到的一些變量稱之為閉包

閉包的本質(zhì)就是函數(shù)嵌套,就是在函數(shù)里面定義函數(shù)

內(nèi)部函數(shù)可以引用外部函數(shù)的參數(shù)和變量

參數(shù)和變量不會被垃圾回收機(jī)制給回收

閉包的用途:可以存循環(huán)的索引值、做私有變量計(jì)數(shù)器

如果沒有閉包,我們就需要更多的參數(shù)傳遞,也減少了代碼的可移植性。

注意點(diǎn):

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

裝飾器:

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

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

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

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