修飾符 python中的裝飾器

2021-06-01 09:51:18 字數 1542 閱讀 4349

裝飾器模式可以在不影響其他物件的情況下,以動態、透明的方式給單個物件新增職責,也能夠處理那些可以撤銷的職責。經常用於日誌記錄、效能測試等場合。

想象一下這個很常見的場景,你寫了乙個方法只提供給以登陸的使用者訪問(事實上我也是通過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 時,不會將以乙個下劃線開頭的物件引入 成俗約定,不做...