python裝飾器以及裝飾器的深入

2021-10-09 05:15:16 字數 3951 閱讀 4643

1.通⽤裝飾器回顧

通過裝飾器的模板格式:

def

(fn)

:def

inner

(*args,

**kwargs)

:#增加的內容

ret = fn(

*args,

**kwargs)

#增加的內容

return ret

return inner

2. 函式的有⽤資訊

(1)獲取函式的注釋資訊,

示例:

def

fun(a,b,c)

:"""

函式的功能:

:param a: 具體傳的引數

:param b: 具體傳的引數

:param c: 具體傳的引數

:return: 返回值

"""print

(fun.__doc__)

"""執行結果如下:

函式的功能:

:param a: 具體傳的引數

:param b: 具體傳的引數

:param c: 具體傳的引數

:return: 返回值

"""

(2)獲取函式的函式名

def

fun(a,b,c)

:"""

函式的功能:

:param a: 具體傳的引數

:param b: 具體傳的引數

:param c: 具體傳的引數

:return: 返回值

"""print

(fun.__name__)

這裡有個問題,如果是函式呼叫了裝飾器的話,會返回裝飾器的內建函式的資訊,並不會返回使用者函式的資訊.

如下:

'''

'''def

(fn)

:def

inner

(*args,

**kwargs)

:print

("test"

) ret = fn(

*args,

**kwargs)

return ret

return inner

deffun

(a,b,c)

:"""

函式的功能:

:param a: 具體傳的引數

:param b: 具體傳的引數

:param c: 具體傳的引數

:return: 返回值

"""print

(fun.__name__)

"""這裡列印的是inner

"""

怎麼才能列印到原來的函式的doc和name呢,這裡需要加入額外的裝飾器

示例如下:

from functools import wraps

def(fn)

: @wraps(fn)

definner

(*args,

**kwargs)

:print

("test"

) ret = fn(

*args,

**kwargs)

return ret

return inner

deffun

(a,b,c)

:"""

函式的功能:

:param a: 具體傳的引數

:param b: 具體傳的引數

:param c: 具體傳的引數

:return: 返回值

"""print

(fun.__name__)

3. 帶引數的裝飾器

如果想對增加的功能進行判斷,這時需要加入引數來實現的,示例如下:

'''

'''def

(flag)

:def

(fn)

:def

inner

(*args,

**kwargs)

:if flag ==

true

:print

("前面增加的內容"

) ret = fn(

*args,

**kwargs)

print

("後面增加的內容"

)return ret

else

: ret = fn(

*args,

**kwargs)

print

("後面增加的內容"

)return ret

return inner

false

)def

fun():

print

("123"

)fun(

)

4. 多個裝飾器同時裝飾⼀個函式

多個裝飾器裝飾的結果請按如下公式來讀取

[(目標)]

其中目標就是目標函式,()就是最靠近的裝飾器,是上層的

示例

def

(fn)

:def

inner

(*args,

**kwargs)

:print

("開始1"

) ret = fn(

*args,

**kwargs)

print

("結束1"

)return ret

return inner

def(fn)

:def

inner

(*args,

**kwargs)

:print

("開始2"

) ret = fn(

*args,

**kwargs)

print

("結束2"

)return ret

return inner

deffunc()

:print

("我是fun1"

)func(

)

一些額外的補充:

enumerate()這個是求乙個列給或者元組的索引和對應的元素的值

示例:

lst =

["a"

,"b"

,"c"

,"d"

]for i,e in

enumerate

(lst)

:print

(i,e)

如果不加解構的話,返回的是元組,示例如下

'''

'''lst =

["a"

,"b"

,"c"

,"d"

]for i in

enumerate

(lst)

:print

(i)"""

(0, 'a')

(1, 'b')

(2, 'c')

(3, 'd')

"""

關於編譯碼:

示例:

s =

"我是乙個好人"

#編碼成bytes型別

bys = s.encode(

"utf-8"

)print

(bys)

#如果想把bytes的utf-8轉成gbk,需要如下操作

print

(bys.decode(

"utf-8"

).encode(

"gbk"

))

python裝飾器 裝飾器

由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...

python裝飾器 Python 裝飾器

簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...

python裝飾器 函式裝飾器,類裝飾器

只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...