python 基礎學習筆記(8) 裝飾器

2022-09-03 20:06:11 字數 3764 閱讀 2658

**裝飾器**

- [ ] 裝飾器和閉包有很大的聯絡。有時你需要在不改變源**的情況下修改已經存在的函式。裝飾器的運用可以提高效率,減少重複的**。

- [ ] 裝飾器的實質是乙個函式。它把乙個函式作為輸入並且返回另乙個函式。

在裝飾器中,通常使用下面這些python技巧:

1.*args 和 **kwargs

2.閉包

3.作為引數的函式

例函式 document_it() 定義了乙個裝飾器,會實現如下的功能:

- [ ] 列印輸出函式的名字和引數的值

- [ ] 執行含有引數的函式

- [ ] 列印輸出的結果

- [ ] 返回修改後的函式

```def document_it(func):

def new_fuction(*args, **kwargs):

print('running fuction:',func,_name_)     

print('positional arguments:',args)

print('keyword arguments',kwargs)

result = func(*args, **kwargs)

print('result:',result)

return result

return new_fuction

```無論傳入 document_it() 的函式 func 是什麼,裝飾器都會返回乙個新的函式,其中包含函式 document_it() 增加的額外語句。實際上,裝飾器並不需要執行函式 func 中的**,只是在結束前函式 document_it() 呼叫函式 func 以便得到 func 的返結果和附加**的結果。

**那麼如何使用裝飾器呢?**

- [ ] 人工賦值

```def document_it(func): #裝飾器

def new_fuction(*args, **kwargs):

print('running fuction:',func)

print('positional arguments:',args)

print('keyword arguments',kwargs)

result = func(*args, **kwargs)

print('result:',result)

return result

return new_fuction

def add_ints(a,b): #被裝飾函式

return a+b

cooler_add_ints = document_it(add_ints) #人工對裝飾器賦值

cooler_add_ints(3,5)

####################################

結果running fuction:

positional arguments: (3, 5)

keyword arguments {}

result: 8

```- [ ] 直接賦值(在要裝飾的函式前新增裝飾器的名字 例 @decorator_name)

```def document_it(func): #裝飾器

def new_fuction(*args, **kwargs):

print('running fuction:',func)

print('positional arguments:',args)

print('keyword arguments',kwargs)

result = func(*args, **kwargs)

print('result:',result)

return result

return new_fuction

@document_it

def add_ints(a,b): #被裝飾函式

return a+b

add_ints(3,5)

###################################

結果running fuction:

positional arguments: (3, 5)

keyword arguments {}

result: 8

```同樣乙個函式可以有多個裝飾器。

下面我們寫乙個對結果求平法的裝飾器 square_it ():

```def document_it(func): #裝飾器

def new_fuction(*args, **kwargs):

print('running fuction:',func)

print('positional arguments:',args)

print('keyword arguments',kwargs)

result = func(*args, **kwargs)

print('result:',result)

return result

return new_fuction

def square_it(func):

def new_function(*args,**kwargs):

result = func(*args,**kwargs)

return result * result

return new_function

@document_it

@square_it

def add_ints(a,b): #被裝飾函式

return a + b

add_ints(3,5)

############################結果

running fuction: .new_function at 0x000001e63b199ea0>

positional arguments: (3, 5)

keyword arguments {}

result: 64

```靠近函式定義 (def上面) 的裝飾器最先執行,然後依次執行上面的,任何順序都會得到相同的結果。

```def document_it(func): #裝飾器

def new_fuction(*args, **kwargs):

print('running fuction:',func)

print('positional arguments:',args)

print('keyword arguments',kwargs)

result = func(*args, **kwargs)

print('result:',result)

return result

return new_fuction

def square_it(func):

def new_function(*args,**kwargs):

result = func(*args,**kwargs)

return result * result

return new_function

@square_it

@document_it ###交換後

def add_ints(a,b): #被裝飾函式

return a + b

add_ints(3,5)

######################結果

running fuction:

positional arguments: (3, 5)

keyword arguments {}

result: 8

Python學習筆記8 語法基礎

s i love hanxuexue print s i love hanxuexue 如果想表示出let s go來 1.可以使用巢狀引號,即外層使用雙引號 2.使用轉義字元 s let s go print s ss let s go print ss sss c user print sss ...

python基礎學習 裝飾器

學習python時,我提出過如下問題 1.裝飾器是什麼?2.乙個 符號 乙個函式名就是乙個裝飾器了?3.什麼時候要用到這是神器的工具?到底怎麼理解 怎麼應用裝飾器,在本文中概括一下自己的理解。一 先舉栗子,逐層分析 1 獲取func函式的執行時間 2 import time 3 4 這是乙個計時函式...

Python基礎學習(裝飾器)

增強乙個函式的功能,但又不想修改函式的定義,這種在 執行期間動態增加功能的方式,稱之為裝飾器。def log func def args,kw print callback format func.name return func args,kw log defnow print 2019 3 21...