1. 程式人生 > >python面向物件之函式裝飾器高階

python面向物件之函式裝飾器高階

函式裝飾器高階

  1. 最新版本

    最新版本的python匯入了functools模組

     from functools import wraps
     def debug(func):
         @wraps(func)
         def wrapper(name):
             print("[DEBUG]: enter {}()".format(func.__name__))
             return func(name)  #此處加上return
         return wrapper
     @debug
     
     def show(s):
         print(s)
     
     show('ppyth')
    
  2. 帶引數的裝飾器

    	from functools import wraps
    	def debug(*text):
    	    def decorated(func):
    	        @wraps(func)
    	        def wrapper(name):
    	            print("[DEBUG]: enter {}()".format(func.__name__))
    	            return func(name)  # 此處加上return
    	
    	        return wrapper
    	    return decorated
    	
    	@debug()  #此處的()不可以刪略
    	def show(s):
    	    print(s)
    	
    	show('ppyth')
    
  3. __call__()

    所有的函式都是可呼叫物件。 一個類例項也可以變成一個可呼叫物件,只需要實現一個特殊方法__call__()

     class Person(object):
         def __init__(self,name):
             self.name=name
     
         def __call__(self, *args, **kwargs):
             print('my name is ',self.name)
             print('my hobby is ',args)
     
     p1=Person('tom')
     
     p1('reading')
    

    所以,在Python中,函式也是物件,物件和函式的區別並不顯著。

  4. 類裝飾器(待續…)

     from functools import wraps
     from datetime import datetime
     
     #類的裝飾器寫法,日誌
     class log(object):
         def __init__(self, logfile='out.log'):
             self.logfile = logfile
     
         def __call__(self, func):
             @wraps(func)
             def wrapped_func(*args, **kwargs):                     
                 self.writeLog(*args, **kwargs)    # 先呼叫 寫入日誌         
                 return func(*args, **kwargs)     # 正式呼叫主要處理函式       
             return wrapped_func
     
        #寫入日誌    
         def writeLog(self, *args, **kwargs):
             time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
             log_str = time+' 操作人:{0[0]} 進行了【{0[1]}】操作'.format(args)           
             with open(self.logfile, 'a',encoding='utf8') as file:
                 file.write(log_str + '\n')
     
     @log()
     def myfunc(name,age):
         print('姓名:{0},年齡:{1}'.format(name,age))
     
     if __name__ == '__main__':
         myfunc('小白', '查詢')
         myfunc('root', '新增人員')
         myfunc('小小', '修改資料')