1. 程式人生 > >python中裝飾器的使用和類裝飾器在類中方法的使用

python中裝飾器的使用和類裝飾器在類中方法的使用

前面一遍講述了裝飾器的基本知識,正好最近有個系統需要進行許可權控制,那麼我們就例項分析下裝飾器的使用。裝飾器是一個面向切面程式設計,主要作用就是許可權控制,插入日誌,效能測試,事務處理,快取等。


對於重要的系統我們僅僅控制登入是不夠的,對於固定人員使用到的系統我們還是要進行許可權的細分。下面是bollte框架下的一個簡單的例子。

def www_auth(func):
    '''
    裝飾器限制ip訪問功能
    '''
    def wrapper(*args,**kargs):
        ips = ['192.168.1.1']
        remoteip = request.environ.get('REMOTE_ADDR')
        #print remoteip
        if remoteip in ips:
            return func(**kargs)
        else:
            redirect('/error')
    return wrapper


#我們再函式的前面加@www_auth即可,這個是對index請求限制的例子。
@route('/index', method='GET')
@www_auth
def index():
    #其他邏輯程式碼
    return template('html/test.html')

@route('/error',method='GET')
def error():
    return template('html/error.html')

當非192.168.1.1的ip訪問過後將會跳轉到錯誤的頁面。

下面的例子是類裝飾器對類中的方法進行裝飾。

class Foo(object):
    def __init__(self):
        pass

    def __call__(self,func):
        def _call(*args,**kw):
            print 'class decorator runing'
            return func(*args,**kw)
         return _call
 
class Bar(object):
    @Foor()
    def bar(self,test,ids):
        print 'bar'
 
Bar().bar('aa','ids')
                      

我們經常會用到的比如說給多執行緒函式加鎖來保證共享資料操作的完整性。

執行緒鎖裝飾器如下:

class StandardOut(object): 
   """ 
   執行緒鎖裝飾器
   """ 
   def __init__(self):
       self.thread_lock = threading.Lock()
    
   def __call__(self,func):
       def _call(*args,**kw): 
           self.thread_lock.acquire()
           func(*args,**kw)
           self.thread_lock.release()
       return _call