一、閉包概念
#定義:如果在乙個內部函式裡,對在外部作用域(但不是在全域性作用域)的變數進行引用,那麼內部函式就被認為是閉包.
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()
三、被裝飾函式的引數
importtime
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)
四、裝飾器引數
importtime
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...