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...