python基礎 之裝飾器

2022-08-30 04:51:07 字數 2181 閱讀 4930

一、閉包概念

#

定義:如果在乙個內部函式裡,對在外部作用域(但不是在全域性作用域)的變數進行引用,那麼內部函式就被認為是閉包.

defouter():

x = 10

def inner(): #

條件一:inner是內部函式

print(x) #

條件二:外部環境的乙個變數

return

inner

inenr()

#報錯,找不到引用變數

func = outer()#

將inner的引用物件賦值給in_func

func() #

相當於執行inner()

二、裝飾器

#

定義:本質依舊是函式,其作用是 在不修改**的前提下,為已經存在的函式新增額外的功能。

import

time

def show_time(f): #

此函式作用相當於:將舊函式帶入,返回乙個同名新函式

definner():

start =time.time()

f()end =time.time()

print('

spend %s

' % (end -start))

return

inner

@show_time

#等同於 foo =show_time(foo) = inner

deffoo():

print('

hello')

time.sleep(2)

foo()

#等同於inner()

三、被裝飾函式的引數

import

time

defshow_time(f):

definner(a,b):

start =time.time()

f(a,b)

end =time.time()

print('

spend %s

' % (end -start))

return

inner

@show_time

deffoo(a,b):

print(a+b)

time.sleep(1)

foo(1,2) #

等同於inner(1,2)

四、裝飾器引數

import

time

deflogger(flag):

defshow_time(f):

definner(a,b):

start =time.time()

f(a,b)

end =time.time()

print('

spend %s

' % (end -start))

if flag=='

true':

print('

操作日誌列印中')

return

inner

return

show_time

@logger(

'true

')

deffoo(a,b):

print(a+b)

time.sleep(1)

@logger(

'')

deffuu(a,b):

print(a-b)

time.sleep(1)

foo(1,2) #

執行列印操作日誌

fuu(1,2) #

不執行列印操作日誌

'''@logger('true') 做了兩件事:

(1)logger('true'):得到閉包函式show_time,裡面儲存環境變數flag

(2)@show_time :foo=show_time(foo)

上面的logger是允許帶引數的裝飾器。它實際上是對原有裝飾器的乙個函式封裝,並返回乙個裝飾器(乙個含有引數的閉包函式)。

當我們使用@logger('')呼叫的時候,python能夠發現這一層的封裝,並把引數傳遞到裝飾器的環境中。

'''

python基礎之裝飾器

裝飾器的本質是乙個閉合函式,該閉合函式的自由變數是乙個函式,可以使 的重要性與擴充套件性大大加強。通過 後新增裝飾器函式 def checkparams fn 只接受字串的裝飾器 if isinstance strname,str 判斷是否是字串型別 return fn strname 如果是則呼叫...

Python基礎之裝飾器

器 工具 裝飾 新增新功能 裝飾器就是定義乙個函式,用該函式去為其他函式新增新功能開放封閉原則 針對上線的功能對拓展是開放的,但是對修改源 以及呼叫方式是封閉的 裝飾器就是在遵循開放封閉原則的前提下為被裝飾物件新增新功能 1 不修改被裝飾物件的源 1 不修改被裝飾物件的呼叫方式 需求 為index加...

Python基礎之裝飾器

器即函式 裝飾即修飾,意指為其他函式新增新功能。裝飾器定義 本質就是函式,功能是為其他函式新增新功能。1.不修改被裝飾函式的源 開放封閉原則 2.為被裝飾函式新增新功能後,不修改被修飾函式的呼叫方式。不用傳引數來使用裝飾器。以下的操作是為函式foo來增加新的計時功能 不改變原函式的 和呼叫方式 im...