關於 Python 裝飾器的一些個人理解

2021-10-23 14:55:50 字數 4793 閱讀 3760

本質是乙個接受引數為函式的函式。

作用:為乙個已經實現的方法新增額外的通用功能,比如日誌記錄、執行計時等。

不帶引數的裝飾器,不用@

# 不帶引數的裝飾器

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