python之裝飾器的學習

2021-07-28 11:38:09 字數 2155 閱讀 5141

遇到問題

1、函式帶括號與不帶括號的區別

加括號是執行函式(呼叫的是函式的return結果),不加括號是函式索引(呼叫的是函式本身)

2、函式中*args和**kwargs所代表的意義

python函式中*args和**kwargs是用來傳遞變長引數的用法。單星號形式(*args)用來傳遞非命名鍵可變引數列表,即tuple。雙星號形式(**kwargs)用來傳遞鍵值可變引數列表,即dict。注意順序,不可逆。否則會出現「syntaxerror: non-keyword arg after keyword arg」錯誤。

3、函式裝飾器@符號的應用

用@decorator來替代 myfunction = decorator(myfunction),此方式是新增了一些語法糖。

然後介紹裝飾器:

什麼是裝飾器?它有什麼作用?它的原理是什麼?我可以用它做什麼?這樣做有什麼好處?

裝飾器其實就是乙個以函式作為引數並返回乙個替換函式的可執行函式。

作用就是當需要增加函式功能時,不用在原有的基礎上更改,而是給它穿上外套,讓它變成我們需要的樣子。

原理就是,利用函式也是物件,在函式的引數傳遞過程中,函式也可以作為乙個引數傳遞進函式內部。

可以用來給原來的函式加以某些限制條件。

它讓**更加簡介:通過將邊界檢測從函式本身分離,使用裝飾器包裝他們,並應用到所有需要的函式中。

另外關於廖大的裝飾器問題

再思考一下能否寫出乙個@log的decorator,使它既支援:

@log

def f():

pass

又支援:

@log(『execute』)

def f():

pass

年輕的兩種寫法

import functools

deflog

(text):

defdecorator

(func):

@functools.wraps(func)

def(*args,**kwargs):

print(text + 'start')

result = func(*args,**kwargs)

print(text + 'end')

return result

if isinstance(text,str):

return decorator

else:

a = text;

text = ""

return decorator(a)

@log

defa

(): print("one")

a()@log("excute")

defb

(): print("two")

b()

**import functools

deflog

(text):

if callable(text):

@functools.wraps(text)

def(*args,**kwargs):

print('start')

result = text(*args,**kwargs)

print('end')

return result

else:

defdecorator

(func):

@functools.wraps(func)

def(*args, **kwargs):

print(text + ' start')

result = func(*args, **kwargs)

print(text + ' end')

return result

return decorator

@log

defa

(): print("one")

a()@log("excute")

defb

(): print("two")

b()**

成熟的寫法

這裡寫**片
更詳細的裝飾器介紹

Python之裝飾器的學習

在了解完閉包之後,相信大家已經對閉包這個概率已經有了一些認識,而我們下面所學的裝飾器這個知識點則是建立在閉包的基礎之上。沒有接觸過閉包的童鞋請看我的部落格 鏈結在文章底部 首先用閉包來實現這個功能 import time def writelog func try with open log.txt...

Python之裝飾器學習筆記

裝飾器本質上是乙個python函式,其返回值也是乙個函式物件 作用 不修改原函式情況下,為已有函式新增新的功能。如插入日誌 效能測試 事務處理 快取 許可權校驗等場景。閉包函式 在函式內部定義乙個內嵌函式,內嵌函式引用了外部函式的變數,此時內嵌函式稱為閉包函式。閉包函式所引用的外部定義的變數被叫做自...

python學習筆記之裝飾器

def print msg print msg是外函式 msg i m 狂師 defprinter printer是巢狀函式 print msg return printer 返回巢狀函式printerdef func a,b def line n nonlocal a nonlocal用於宣告變數...