29 python學習筆記 裝飾器

2021-07-28 03:34:48 字數 3299 閱讀 8923

裝飾器函式——用來對函式的擴充套件,補充。

高階函式+巢狀函式 =》裝飾器

原則:

1 / 不能修改被裝飾的函式的源**

2 / 不能修改被裝飾的函式的呼叫方式

實現裝飾器的知識儲備:

1 / 函式即『變數』

def test():

函式體test = '函式體'

2 / 高階函式

兩個條件:

1 / 把乙個函式名當作實參傳給另外乙個函式(在不修改被裝飾函式源**的情況下為其新增功能)

2 / 返回值中包含函式名(不修改函式的呼叫方式)

import time

def bar():

time.sleep(2)

print('in the bar')

def test2(func):

print(func)

return(func)

## print(test2(bar))

bar = test2(bar)

bar()

3 / 巢狀函式

裝飾器的**示例:

高階函式+巢狀函式 =》裝飾器

1 / 不能修改被裝飾的函式的源**

2 / 不能修改被裝飾的函式的呼叫方式

由簡到繁的**說明裝飾器:

——沒有傳遞引數的**示例講解:

import time

def timer(func):##裝飾器

def deco():

start_time = time.time()

func()

end_time = time.time()

print('the fun run time is %d' %(end_time-start_time))

return deco

@timer ##語法糖 等價於test1 = timer(test1)

def test1():

time.sleep(2)

print('in the test1')

test1()

'''註解:

當test()呼叫時,實際因為語法糖的功能,等價於test1 = timer(test1),於是呼叫了裝飾器timer,

timer傳入test1函式作為引數,執行裝飾器下面的deco函式,執行deco函式,並return deco,注意這個deco沒有小括號,返回的是deco的記憶體位址值。

最後呼叫test1()實際上是 「deco記憶體位址值()」在執行。

'''

——被裝飾函式需要傳遞引數的**實力講解:

import time

def timer(func):##裝飾器

def deco(*args,**kwargs):##test2呼叫的時候傳遞了引數name,呼叫裝飾器的時候,deco()也需要有引數name

##由於傳遞進來的引數不好確定,所以用*args,**kwargs接收

start_time = time.time()

func(*args,**kwargs)

end_time = time.time()

print('the fun run time is %d' %(end_time-start_time))

return deco

@timer ##語法糖 等價於test1 = timer(test1)

def test1():

time.sleep(2)

print('in the test1')

@timer ##語法糖 等價於test2 = timer(test2)

def test2(name): ##test2呼叫的時候傳遞了引數name,呼叫裝飾器的時候,deco()也需要有引數name

time.sleep(3)

print('name:',name)

test1()

test2('drglon')

'''註解:

當test2()呼叫時傳入了引數name,實際因為語法糖的功能,等價於test2 = timer(test2(name)),於是呼叫了裝飾器timer,並傳入引數

timer傳入test2(name)函式作為引數,執行裝飾器下面的deco函式,並把引數name傳遞給deco函式,

執行deco(name)函式,並return deco,注意這個deco沒有小括號,返回的是deco的記憶體位址值。

最後呼叫test2(name)實際上是 「deco記憶體位址值(name)」在執行。

因為裝飾器中deco()函式需要接收的引數不固定,所以用*args,**kwargs接收。變的通用。

'''

——關於被裝飾函式的返回值如何體現

import time

user,passwd = 'dralon','abc123'

def auth(func):

username = input('username:').strip()

password = input('passwd:').strip()

if user ==username and passwd == password:

print('has authentication')

res = func(*args,**kwargs) ##實際上home()的時候,home()的return home返回值需要在這裡體現。設定乙個變數儲存home()函式的return home 返回值

print("這個是個home()的返回值 %s" %res)

else:

print('please input ')

def index():

print('welcom to index page')

@auth

def home():

print('welcom to home page')

return home ##這個返回結果,在裝飾器中要有返回才能體現出來

@auth

def bbs():

print('welcom to bbs page')

# index()

home()

# bbs()

高階函式+巢狀函式 =》裝飾器

Python 學習筆記 裝飾器

裝飾器也是乙個函式 巢狀 用來裝飾某個函式,來看下面的 import time deftime count func def start time.time func end time.time print this funnction costs end start deftellhi print...

Python學習筆記 裝飾器

裝飾器 概念 是乙個閉包,把乙個函式當做引數返回乙個替代版的函式,本質上就是乙個返回函式的函式 簡單的裝飾器 def func1 print welcome to beijing def outer func def inner print func return inner f是函式func1的加...

Python裝飾器 學習筆記

python中一切皆物件,函式也可以當做引數傳遞 裝飾器接受函式當做引數,新增功能後返回乙個新函式的函式 python中裝飾器使用 import time deflog time func def log args,kwargs begin time.time res func args,kwarg...