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企業郵箱,從使用者的實際需求出...