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('小小', '修改数据')
    

    [参考] (https://www.cnblogs.com/cicaday/p/python-decorator.html)

    [参考] (https://www.jianshu.com/p/9e9726055bbe)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值