閉包與裝飾器

2021-10-04 07:36:06 字數 1909 閱讀 5620

閉包函式=命名空間與作用域+函式巢狀+函式物件

核心點:名字的查詢關係是以函式定義階段為準

"閉"函式指的該函式是內嵌函式

"包"函式指的該函式包含對外層函式作用域名字的引用(不是對全域性作用域)

方式一:直接把函式體需要的引數定義成形參

def f2(x):

print(x)

f2(1)

f2(2)

f2(3)

方式二:在函式裡面再套一層函式。裡函式就能呼叫外層函式

def f1(x): # x=3

x=3def f2():

print(x)

return f2

x=f1(3)

print(x)

x()

裝飾器指的定義乙個函式,該函式是用來為其他函式新增額外的功能
開放封閉原則

開放:指的是對拓展功能是開放的

封閉:指的是對修改源**是封閉的

裝飾器就是在不修改被裝飾器物件源**以及呼叫方式的前提下為被裝飾物件新增新功能

#def outter(func):

# # 1、呼叫原函式

# # 2、為其增加新功能

# res=func(*args,**kwargs)

# return res

#def sum(x,y)

例如:def

outter

(func)

:def

(*args,

**kwargs)

: start=time.time(

) res=func(

*args,

**kwargs)

time.sleep(3)

end=time.time(

)print

(end-start)

return res

defsum

(x,y)

:print

(x+y)

sum=outter(

sum)

sum(1,

2)這個就是不修改sum函式中相加的功能而增加計算時間的函式

def

auth

(file):

defoutter

(func)

:def

(*args,

**kwargs)

:# 1、呼叫原函式

# 2、為其增加新功能

res=func(

*args,

**kwargs)

return res

return outter

這樣就可以改變file的值對裡面的函式產生影響了

對於裝飾器來說只是將功能複製了一遍,但是對於記憶體是產生了乙個新的位址,這樣就有點掩耳盜鈴了。那麼我們除了功能還要將記憶體位址也複製過來,那麼我們就需要用到wraps了

先導入

from functools import wraps

然後在函式中匯入

defoutter

(func)

: wraps(func)

def(

*args,

**kwargs)

:# 1、呼叫原函式

# 2、為其增加新功能

res=func(

*args,

**kwargs)

return res

defsum

(x,y)

這樣就能把所有地方複製的一模一樣了

裝飾器與閉包

閉包 內層函式呼叫外層函式的引數,並且返回內層函式,叫做閉包。裝飾器 是裝飾器的符號 裝飾器是對閉包的一種利用,內層函式呼叫外層函式的引數,並且返回內層函式,叫做閉包,把呼叫的引數,換成函式,就是裝飾器,因為python中,函式也是當做物件,從而有裝飾器這一種特殊的用法。有引數的裝飾器就是在外面一層...

閉包與裝飾器

閉包 a 1 def inner return a return inner print ret 保證資料安全性 裝飾器 假裝分隔符 裝飾器def warpper f 這裡接受func記憶體位址,f是要被裝飾的函式的函式名,f就是相當於閉包裡面的自由變數 def inner args,kwargs ...

閉包 與 裝飾器

函式引數 函式名儲存了函式所在的空間位址 函式名 到函式所在的空間執行裡面的 閉包 發生函式巢狀 外層函式有引數 內層函式使用到 節省系統資源 提高 復用率的一種特殊語法 語法格式 def 外層函式 引數 def 內層函式 pass return 內層函式 閉包流程 執行第五行 呼叫func out...