裝飾器補充

2022-03-17 06:25:33 字數 3145 閱讀 4361

一、通用裝飾器回顧

def inner(*args,**kwargs):

'執行目標函式之前要執行的內容

'ret = func(*args,*kwargs)

'執行目標函式之後要執行的內容

'return

ret

return

inner

def target_func():

print(

'我是目標函式')

#呼叫目標函式

二、函式的有用資訊

1、給函式新增注釋:說明函式的意義

#

def eat(food):

#"""

#吃函式: 把傳遞進來的內容吃掉 #函式的注釋,就是這個函式是幹嘛的

#:param food: 食物 #引數 food 是什麼意思

#:return: none #返回什麼東西

#"""

#print("我要吃", food)

#eat("烤肉")

2、獲取函式的相關資訊

def

eat(food):

"""吃函式

:param food:水果

:return:

"""print('

我要吃'

,food)

eat('西瓜

')print(eat.__doc__

) #獲取函式的文件注釋 函式名._doc_

print(eat.__name__

)        #獲取函式名稱      函式名._name_

執行結果:

我要吃 西瓜

吃函式:param food:水果

:return

:

eat

from functools import

wraps #引入函式模組

def @wraps(fn)

#這個**的作用. 把inner的__name__ __doc__ 替換成fn的__name__

def inner(*args, **kwargs):

print("

我是前面")

ret = fn(*args, **kwargs)

print("

我是後面")

return

ret

return

inner

#def

func():

print("

我是func")

func()

print(func.__name__)

三、裝飾器傳參:

from functools import

wraps

def

fn: 被裝飾的函式

@wraps(fn)

def inner(*args, **kwargs): #

inner => 最終執行的

if flag ==true:

print("

打**問問金老闆.安全不安全啊")

ret = fn(*args, **kwargs) #

fn 被裝飾的函式

print("

金老闆騙我")

return

ret

else

: ret = fn(*args, **kwargs) #

if 條件不成立,走else

return

ret

return

inner

return

#傳遞true和false來控制裝飾器內部的執行結果

#帶引數的裝飾器的執行流程: 先執行@後面的函式. 然後再加上@ 組裝成語法糖

def yue(): #

inner

print("

約一約"

)yue()

四、多個裝飾器裝飾同乙個函式

def

def inner(*args,**kwargs):

print('0'

) ret = func(*args,**kwargs)

print('00'

)

return

ret

return

inner

def

def inner(*args,**kwargs):

print('1'

) ret = func(*args,**kwargs)

print('11'

)

return

ret

return

inner

def

def inner(*args,**kwargs):

print('2'

) ret = func(*args,**kwargs)

print('22'

)

print('

222'

)

return

ret

return

inner

deftarget_func():

print('

我是熊貓')

target_func()

執行結果:

1                      第三層裝飾器前

2                      第二層裝飾器前

0                      第一層裝飾器前

我是熊貓    

00                     第一層裝飾器後

22                     第二層裝飾器後

222                   第二層裝飾器後

11                     第三層裝飾器後

補充裝飾器

1.用functools.wraps隱藏包裝函式 先實現乙個簡單的裝飾器,過濾非負引數 def decorate func def wrap args,kwargs return return wrap myfilter def test args print args is s args 可以發現...

python 裝飾器 補充

在寫python類的時候,雖然可以通過 例項名.變數名 的方式對例項中的變數進行讀取和賦值。但出於規範性等等原因,我們最好還是寫getter和setter,使用property 函式和 property修飾符。第一種方法,使用property 函式 class person def init sel...

Python札記 裝飾器補充

本隨筆是對python札記 裝飾器的一些補充。使用裝飾器的時候,被裝飾函式的一些屬性會丟失,比如如下 usr bin env python def deco func print wrap start func print wrap end n deco def foo docstring for ...