Python學習之路 裝飾器(4)

2021-09-28 14:35:37 字數 2360 閱讀 3580

函式通常都是帶有返回值的,當裝飾器修飾帶有返回值的函式時該怎麼實現呢?

#coding=utf-8

def f1(func):

print('in func')

def f1_inner():

print('in f1_inner')

value = func()

#return value

return f1_inner

@f1def f():

str1 = 'hello world'

print('in f')

return str1

if __name__ == '__main__':

value = f()

print('the value is :',value)

結果:in func

in f1_inner

in f

the value is : none

在以上例子中函式f在定義時返回了乙個字串,在正常呼叫後將返回的字串列印出來,發現列印的結果是none。來分析一下:裝飾器f1修飾f,因此在呼叫f()後,f實際指向的是f1中的f1_inner,雖然f本身有返回值,但是在f1_inner中呼叫func()(即傳入的f)時卻沒有把返回值返回,因此最終無法得到f()的返回值。

把上面例子中注掉的**放開即可得到函式f()的返回值,大家可以試一下。

能否用可以修飾帶返回值的裝飾器修飾不帶返回值的函式呢?試一下就可以了。

#coding=utf-8

def f1(func):

print('in func')

def f1_inner():

print('in f1_inner')

return func()

return f1_inner

@f1def f():

str1 = 'hello world'

print('in f')

return str1

@f1def f_bak():

print('in f_bak')

if __name__ == '__main__':

value = f()

print('the value is :',value)

print('********************')

f_bak()

結果:in func

in func

in f1_inner

in f

the value is : hello world

********************

in f1_inner

in f_bak

上面的例子中裝飾器f1是可以修飾帶有返回值的函式的,且同時用來修飾了帶有返回值和不帶返回值的函式。在正常呼叫f()和f_bak()後並沒有出現語法錯誤,因此乙個可以修飾帶返回值的裝飾器是可以用來裝飾任何函式的,無論函式本身帶不帶返回值。

上面的例子已經證明了乙個可以修飾帶返回值的裝飾器是可以用來裝飾任何函式的,無論函式本身帶不帶返回值。並且在之前也說明了裝飾器修飾帶引數的函式的例子,特別提到了*args和**kwargs的用法,至此可以定義乙個通用的裝飾器:

#coding=utf-8

def f1(func):

print('in func')

def f1_inner(*args,**kwargs):

print('in f1_inner')

print(args)

print(kwargs)

return func(*args,**kwargs)

return f1_inner

@f1def f():

str1 = 'hello world'

print('in f')

return str1

@f1def f_bak():

print('in f_bak')

if __name__ == '__main__':

value = f()

print('the value is :',value)

print('********************')

f_bak()

結果:in func

in func

in f1_inner

(){}

in f

the value is : hello world

********************

in f1_inner

(){}

in f_bak

Python學習之路 裝飾器(1)

裝飾器本身是利用閉包實現的,因此只有真正學會了閉包中的知識點才能完全理解裝飾器的語法。試想乙個問題 在乙個工程中有乙個函式func 現在有乙個需求是func 現在本身不能滿足的,因此需要重新實現func 的功能。這是正常的思路,也是可行的,但是卻違背了開發中的 開放 封閉 原則。封閉 函式本身的功能...

Python學習之路 裝飾器(2)

coding utf 8 def f1 func print in f1 def f1 inner print in f1 inner func return f1 inner def f2 func print in f2 def f2 inner print in f2 inner func r...

Python學習之路 裝飾器(3)

上兩篇提到的裝飾器的例子中,被修飾的函式沒有引數,那麼如果修飾帶引數的裝飾器又該如何書寫呢?coding utf 8 def f1 func print in f1 def f1 inner print in f1 inner func return f1 inner f1def f a,b pri...