本質是乙個接受引數為函式的函式。
作用:為乙個已經實現的方法新增額外的通用功能,比如日誌記錄、執行計時等。
不帶引數的裝飾器,不用@
# 不帶引數的裝飾器
defdeco_test
(func)
:def
(*args,
**kwargs)
:print
("before function"
) f = func(
*args,
**kwargs)
print
("after function"
)return f
defdo_something
(a,b,c)
:print
(a) time.sleep(1)
print
(b) time.sleep(1)
print
(c)return a
if __name__ ==
'__main__'
:# 不用@
f = deco_test(do_something)
("1"
,"2"
,"3"
)
輸出:
before function12
3after function
個人理解:
相當於在do_something
函式外面套了兩個輸出:before function
和after function
。
不帶引數的裝飾器,用 @
# 不帶引數的裝飾器
defdeco_test
(func)
:def
(*args,
**kwargs)
:print
("before function"
) f = func(
*args,
**kwargs)
print
("after function"
)return f
@deco_test
defdo_something
(a,b,c)
:print
(a) time.sleep(1)
print
(b) time.sleep(1)
print
(c)return a
if __name__ ==
'__main__'
:# 使用@
f = do_something(
"1",
"2",
"3")
輸出:
before function12
3after function
個人理解:
相當於執行do_something
函式的時候,因為有@
的原因,已經知道有一層裝飾器deco_test
,所以不需要再單獨寫deco_test(do_something)
了。
帶引數的裝飾器
# 帶引數的裝飾器
deflogging
(level)
:def
(func)
:def
(*args,
**kwargs)
:print
(": enter function ()"
.format
(level=level, func=func.__name__)
) f = func(
*args,
**kwargs)
print
("after function: : enter function ()"
.format
(level=level, func=func.__name__)
)return f
@logging(level=
"debug"
)def
do_something
(a,b,c)
:print
(a) time.sleep(1)
print
(b) time.sleep(1)
print
(c)return a
if __name__ ==
'__main__'
:# 使用@
f = do_something(
"1",
"2",
"3")
輸出:
[debug]: enter function do_something()12
3after function: [debug]: enter function do_something()
個人理解:
裝飾器帶了乙個引數level = "debug"
。
類裝飾器
# 類裝飾器
class
deco_cls
(object):
def__init__
(self, func)
: self._func = func
def__call__
(self,
*args,
**kwargs)
:print
("class decorator before function"
) f = self._func(
*args,
**kwargs)
print
("class decorator after function"
)return f
@deco_cls
defdo_something
(a,b,c)
:print
(a) time.sleep(1)
print
(b) time.sleep(1)
print
(c)return a
if __name__ ==
'__main__'
:# 使用@
f = do_something(
"1",
"2",
"3")
輸出:
class decorator before function12
3class decorator after function
個人理解:
使用乙個裝飾器去包裝函式,返回乙個可呼叫的例項。 因此定義了乙個類裝飾器。
兩層裝飾器
# 不帶引數的裝飾器
defdeco_test
(func)
:def
(*args,
**kwargs)
:print
("before function"
) f = func(
*args,
**kwargs)
print
("after function"
)return f
# 帶引數的裝飾器
deflogging
(level)
:def
(func)
:def
(*args,
**kwargs)
:print
(": enter function ()"
.format
(level=level, func=func.__name__)
) f = func(
*args,
**kwargs)
print
("after function: : enter function ()"
.format
(level=level, func=func.__name__)
)return f
@logging(level=
"debug"
)@deco_test
defdo_something
(a,b,c)
:print
(a) time.sleep(1)
print
(b) time.sleep(1)
print
(c)return a
if __name__ ==
'__main__'
:# 使用@
f = do_something(
"1",
"2",
"3")
輸出:
before function12
3after function
個人理解:
在函式do_something()
外面先套一層deco_test()
裝飾器,再在最外面套一層logging()
裝飾器。
第九章:元程式設計
關於python裝飾器的一些體會總結。
首先說下裝飾器的目的,在不改變原函式的情況下給函式新增功能。裝飾器的三個要求 不能修改被裝飾的函式的源 不能修改被裝飾的函式的呼叫方式 滿足1 2的情況下給程式增添功能 假設給下列函式新增個計算執行時間的功能,原函式 然後 看似實現了功能,可是有個問題,此時只能用time count test 無法...
關於SpringIOC的一些個人理解
根據上面這個思路接著說的話,那就順理成章了,首先spring容器將所有的bean都放在一起進行管理,然後當某個應喲經程式需要用到某個bean物件的時候,說一下,然後spring自動給這個程式分配他所需要的物件。這就是所謂的控制反轉了吧?本來這個宣告建立bean物件的過程應該由程式自己進行,建立呼叫然...
python裝飾器的一些理解
以乙個帶引數的函式的裝飾器為例子 def debug func def something 指定一毛一樣的引數 print debug enter format func.name return func something 這裡寫func something 好像也可以 debug defsay ...