裝飾器模式可以在不影響其他物件的情況下,以動態、透明的方式給單個物件新增職責,也能夠處理那些可以撤銷的職責。經常用於日誌記錄、效能測試等場合。
想象一下這個很常見的場景,你寫了乙個方法只提供給以登陸的使用者訪問(事實上我也是通過django的@login_required才了解到@修飾符的),你可以寫以下**:
def a():
if user.is_login():
do something
else:
pass
這當然沒什麼問題,但是你又寫了乙個方法b,也要求只有登入使用者可以訪問,於是有寫了以下**:
def b():
if user.is_login():
do something
else:
pass
問題出來了,你在複製貼上,如果不是兩個方法而是一堆方法,你可能就有點受不了啦。當然聰明的你可以想出這個方法:
def a():
pass
def b():
pass
def login_required(fn):
def ff():
if user.is_login():
fn()
else:
pass
return ff
a = login_required(a)
b = login_required(b)
你可能沒有想到,對於這麼好用的東西,python優雅的支援,這就是@修飾符
def login_required(fn):
def ff():
if user.is_login():
fn()
else:
pass
return ff
@login_required
def a():
pass
@login_required
def b():
pass
在方法a上邊寫乙個@修飾符,呼叫方法a的時候會呼叫修飾符後邊的方法b,方法b以a方法為引數,而且需要返回乙個可呼叫的物件,這個可呼叫的物件會使用a方法提供的引數執行。看這個例子:
#!/usr/bin/env python
def a(fn):
print 'a'
def d(st):
print st+'d'
return d
def b(fn):
print 'b'
return fn
@a@b
def c(st):
print st
c('c')
輸出結果:bacd
我們呼叫c('c')的時候會先呼叫b(c),b(c)列印字元"b"然後返回c,然後再呼叫a(c),a(c)列印字元"a",然後返回方法d,然後再執行d('c'),列印cd。
Python的 修飾符和裝飾器
發表於 由python的修飾器的英文名叫decorator。修飾符必須出現在函式定義前一行,不允許和函式定義在同一行。也就是說 a def f 是非法 的。只可以在模組或類定義層內對函式進行修飾,不允許修飾乙個類。所謂裝飾器就是把原函式包裝一下,對原函式進行加工,新增一些附加功能,裝飾器本身就是乙個...
python 修飾符 python 修飾符
修飾符基礎 閉包 什麼是閉包呢?標準的概念大家可以看wikipedia上的解釋 舉個例子 def do add base def add increase return base increase return add do add函式裡巢狀了乙個內層函式add,這個內層函式就是乙個閉包,其實可以也...
python 修飾符 python訪問修飾符
許可權訪問 偽許可權,只是壓縮時按規則換了變數名,python 的哲學是假定使用者都會使用 xx 以單下劃線開頭的表示的是protected型別的變數。即保護型別只能允許其本身與子類進行訪問。若內部變數標示,如 當使用 from m import 時,不會將以乙個下劃線開頭的物件引入 成俗約定,不做...