Python高階 閉包與裝飾器

2021-08-28 02:15:22 字數 4026 閱讀 4189

1.函式引數:

(1)函式名存放的是函式的位址

(2)函式名()存放的是函式內的**

(3)函式名只是函式**空間的引用,當函式名賦值給乙個物件的時候,就是引用傳遞

def

func01

(): print("func01 is show")

test = func01

print(func01)

print(test)

test()

2.閉包:(1)內層函式可以訪問外層函式變數

(2)閉包就是乙個巢狀定義的函式,在外層執行時才開始內層函式的定義,然後將內部函式的引用傳遞函式外的物件(閉包外層函式的返回值為內層函式名)

(3)內部函式和使用的外部函式提供的變數構成的整體稱為閉包

def

func_out

(rate):

deffunc_in

(money):

print(rate * money)

return func_in

usa_money = func_out(0.7)

usa_money(100)

usa_money(200)

裝飾器就是在不改變函式的原有**的前提下 給函式新增新的功能,裝飾器一般是乙個閉包。

1.裝飾器:

# 在不改變函式的原有**的前提下 給函式新增新的功能

deffunc_out

(func):

deffunc_in

(): print("驗證")

func()

return func_in

@func_out

deflogin

(): print("登入")

# 有裝飾器 裝飾器下面正好是乙個函式

# login = func_out(login) 重點

login()

如果@func_out裝飾器下剛好是乙個login函式,會執行:

login =func_out(login)
login = func_out(login) = func_in
所以login()的執行結果為func_in(),即:

print('驗證')

func() # func指原login函式的位址

就實現了不改變原函式的情況下給函式新增新功能

執行結果:

2.裝飾有返回指函式:

def

func_out

(func):

deffunc_in

():# ret = func()

# def login():

# return 100

return func()

return func_in

@func_out

deflogin

():return

100# login() ==> func_in()

# func ==> 原始的login

f = login()

print(f)

3.裝飾有引數函式:

def

func_out

(func):

deffunc_in

(a):

func(a)

return func_in

@func_out

deflogin

(a):

print(a)

# login() ==> func_in()

# func ==> 原始的login

login(10)

4.裝飾器通用版:

def

func_out

(func):

deffunc_in

(*args,**kwargs):

return func(*args,**kwargs)

return func_in

@func_out

deflogin

(*args,**kwargs):

print(args)

print(kwargs)

# login() ==> func_in()

# func ==> 原始的login

login(10,20,age = "17",name="123")

5.類裝飾器:

class

foo(object):

def__init__

(self, func):

self.func = func

def__call__

(self):

print("驗證")

self.func()

@foo

deflogin

(): print("登入")

# login = foo(login)

login()

6.多裝飾器:

def

func_out01

(func01):

print("func_out01 is show")

deffunc_in01

(): print("func_in01 is show")

func01()

return func_in01

deffunc_out02

(func02):

print("func_out02 is show")

deffunc_in02

(): print("func_in02 is show")

func02()

return func_in02

@func_out02 # login = func_out02(login)

@func_out01 # login = func_out01(login)

deflogin

(): print("login is show")

login()

執行結果:

因為@閉包名下為函式時才會實現裝飾器,所以func_out1會先裝飾函式,func_out2會後裝飾函式,所以外層函式先執行func_out1,後執行func_out2;因為func_out1先裝飾函式,func_out2後裝飾函式,所以func_out1裝飾後,原函式為先輸出func_in1內的語句,再輸出原login,然後func_out2裝飾後,執行順序為先輸出func_in2的語句,再輸出裝飾後的login函式,即:func_in2——func_in1——login。

7.給裝飾器傳遞函式:

def

route

(引數):

print(引數)

deffunc_out

(func):

deffunc_in

(): func()

return func_in

return func_out

@route(引數)

defindex

():return

"index is show"

Python高階 閉包與裝飾器

前言 在python中,閉包是一種非常有用的功能!它通常與裝飾器一起搭配使用,可以在不改變被裝飾函式的功能的基礎上,完成更多的功能。如許可權認證。一 如何定義閉包 1.閉包就是兩個巢狀的函式,外層函式返回內層函式的引用,而且外層函式必須攜帶引數!為什麼外層函式必須要有引數呢?可以思考一下!基本格式如...

python閉包與裝飾器

首先閉包函式我的理解是,乙個函式內可以巢狀定義乙個函式,並將巢狀定義的函式返回 如果不返回執行完函式物件也就銷毀了 巢狀函式可以接收外部函式的引數,不同引數就可以變更巢狀函式的功能,返回不同功能的巢狀函式物件。以下是閉包函式簡單示例,如果inner函式不接收outer的引數x也就沒有意義了,一定要返...

Python閉包與裝飾器

一.閉包 如果乙個內嵌函式中引用了外部函式中的變數 非全域性變數 那麼該內嵌函式稱之為閉包 也就是將組成函式的語句和這些語句的執行環境打包在一起時,得到的物件 閉包滿足的三個條件 1.必須是內嵌函式 2.外層函式返回值是內嵌函式 3.內嵌函式引用外層函式變數 def funx x def funy ...