Python 如何理解又暈又好用的裝飾器

2021-09-03 09:04:37 字數 4177 閱讀 4842

python 裝飾器這東西對初學者來說是個坑,很容易繞暈,筆者當時初學裝飾器時花費了數天時間,看了不同講師對這塊內容的講解,還是一知半解。  

不過裝飾器在開發中可是很好用的,有必要攻破,希望這篇文章能幫助學習者快速攻破難關。

初步理解

# 先來看乙個簡單函式

def show():

print ('mr tu')

show()

# 執行結果 :

mr tu

# 現在我們用裝飾器擴充套件這個函式,在列印 " mr tu " 之前列印一行 " hello "  

def decorate(fun1):

print('hello')

fun1()

@decorate

def show():

print ('mr tu')

show()

# 執行結果 :

hello

mr tu

# 現在解釋上面的**。

# 2、 @'函式名'是python的一種語法糖 @decorate 等於 decorate(show) 

# 還是暈,不明白?  沒關係,看下面**:

def decorate(fun1):

print('hello')

fun1()

def show():

print ('mr tu')

f1 = decorate(show)

f1()

# 執行結果 :

hello

mr tu

# 換成這種寫法,執行效果是一樣的,因為這就是 @decorate 的本質。

# 就是將被裝飾器裝飾的函式show作為引數傳給裝飾器函式。

# 總結執行過程:

# 1、show函式作為引數傳給裝飾器函式 decorate ,那麼 fun1 = show

# 現在明白了吧,只要這裡明白,下面的就很好理解了。

裝飾帶引數的函式

# 乙個引數

def decorate(fun1):

print('hello')

fun1(arg1)

print('nice to meet you')

@decorate

def show(arg1):

print (arg1)

show('mr alice')

# 執行結果:

hello

mr alice

nice to meet you

# 兩個引數

def decorate(fun1):

print('hello')

fun1(arg1,arg2)

print('nice to meet you')

@decorate

def show(arg1,arg2):

print (arg1,arg2)

show('mr alice','mr tom')

# 執行結果:

hello

('mr alice', 'mr tom')

nice to meet you

# n個引數

def decorate(fun1):

print('hello')

fun1(*args,**kwargs)

print('nice to meet you')

@decorate

def show(*args,**kwargs):

print (args[0])

print (args[1])

print (args[2])

show('mr alice','mr tim','mr tu')

# 執行結果:

hello

mr alice

mr tim

mr tu

nice to meet you

乙個函式被多個裝飾器裝飾

def decorate01(fun1):

print('hello world')

print('i am decorate01')

fun1(*args,**kwargs)

def decorate02(fun1):

print ('i am decorate02')

fun1(*args,**kwargs)

print('nice to meet you')

@decorate01

@decorate02

def show(*args,**kwargs):

print (args[0])

print (args[1])

print (args[2])

show('mr alice','mr tim','mr tu')

# 執行結果:

hello world

i am decorate01

i am decorate02

mr alice

mr tim

mr tu

nice to meet you

# 觀察print放置的位置不同,對應的輸出結果不同。

def decorate01(fun1):

print('hello world')

fun1(*args,**kwargs)

print('i am decorate01')  # 替換到了下面

def decorate02(fun1):

print ('i am decorate02')

fun1(*args,**kwargs)

print('nice to meet you')

@decorate01

@decorate02

def show(*args,**kwargs):

print (args[0])

print (args[1])

print (args[2])

show('mr alice','mr tim','mr tu')

# 執行結果:

hello world

i am decorate02

mr alice

mr tim

mr tu

nice to meet you

i am decorate01

裝飾器功能擴充套件

#!/usr/local/python27/bin/python2.7

def before(request,*args,**kwargs):

print('before')

def after(request,*args,**kwargs):

print('after')

def filter(before_func,after_func):

def outer(fun1):

before_result = before_func(request,*args,**kwargs)

if(before_result != none):

return before_result;

fun1_result = fun1(request,*args,**kwargs)

if(fun1_result != none):

return fun1_result;

after_result = after_func(request,*args,**kwargs)

if(after_result != none):

return after_result;

return outer

@filter(before,after)

def show(request,*args,**kwargs):

print ('mr tu')

show('1')

# 執行結果:

before

mr tu

after

函式若未定義返回值,執行成功返回值預設為 none ,這裡的語句 if (before_result != none) 意思就是before函式執行失敗時採取什麼操作。

求橙閉門課 如何讓員工又傻又天真,又猛又持久?

說起文化大家可能會覺得有點虛,但想想,為什麼春節那麼多人擠著站著不睡也要回家,中秋節為什麼不吃個月餅就覺得沒過中秋節?這其實就是文化信仰,文化的力量。我相信,只要是乙個組織,它要能生存下來,一定是有企業文化,有乙個堅強的信仰的,這個信仰就是使命帶來的,阿里的使命是有 讓天下沒有難做的生意 本期分享嘉...

如何想到又做到

讀書對於我們的思想而言是一種輸入,那麼相應的必須有所輸出,有的人一年能讀幾百本,卻並沒有想象中的進步那麼大,很大程度上,是因為讀書變成了一種膚淺的消遣,沒有目的性 現代社會,需要我們功利性的去讀書,這樣才能讓自己真正實現讀書改變命運 否則讀書破萬卷,仍然不過是乙個酸儒而已 本篇boke從 如何想到又...

郵箱哪個好用又安全?什麼郵箱比較安全好用

郵箱哪個好用又安全?什麼郵箱比較安全好用?電子郵箱是陪伴我們日常辦公最多的工具之一,企業及個人的需求日益增加,安全性 私隱性成為了我們最關注的問題。究竟如何選到更安全的電子郵箱呢?安全穩定才是郵箱的基礎 安全性 私密性 穩定性是使用郵箱的核心所在,作為行業23年的tom企業郵箱,從使用者的實際需求出...