• 多个装饰器装饰一个函数


    # def debug(func):
    # #     def wrapper():
    # #         print ("[DEBUG]: enter {}()".format(func.__name__))
    # #         return func()
    # #     return wrapper
    # # @debug
    # # def say_hello():
    # #     print("hello!")
    # say_hello()  # 添加功能并保持原函数名不变
    #这是最简单的装饰器,但是有一个问题,如果被装饰的函数需要传入参数,那么这个装饰器就坏了。因为返回的函数并不能接受参数
    #可以指定装饰器函数wrapper接受和原函数一样的参数,比如:
    # def debug(func):
    #     def wrapper(something):  # 指定一毛一样的参数
    #         print("[DEBUG]: enter {}()".format(func.__name__))
    #         return func(something)
    #     return wrapper  # 返回包装过函数
    #
    # @debug
    # def say(something):
    #     print ("hello {}!".format(something))
    # say('今天是个好日子')
    # def debug(func):
    #
    #     def wrapper(*args, **kwargs):  # 指定宇宙无敌参数
    #         print ("[DEBUG]: enter {}()".format(func.__name__))
    #         print ('Prepare and say...',)
    #         return func(*args, **kwargs)
    #     return wrapper  # 返回
    #
    # @debug
    # def say(something):
    #     print ("hello {}!".format(something))
    # say('今天是个好日子')
    # class logging(object):
    #     def __init__(self, user_type=None):
    #         self.user_type = user_type
    #
    #     def __call__(self, func):  # 接受函数
    #         def wrapper(*args, **kwargs):
    #             if self.user_type==1:
    #                 print('我是普通用户')
    #             elif self.user_type==2:
    #                 print('我是管理员')
    #             else:
    #                 print('我是普通用户')
    #             func(*args, **kwargs)
    #
    #         return wrapper  # 返回函数
    #
    #
    # @logging(user_type=1)
    # def say(something):
    #     user_type = 1
    #     print("say {}!".format(something))
    #
    # say('今天天气不错')
    import time
    
    #一个装饰器相当于闭包
    def set_func(func):
        def inner(*args,**kwargs):
            start_time = time.time()
            #func(args,kwargs)#不行,相当于传递两个参数,一个元组,一个字典
            # func(*args,**kwargs)#拆包
            end_time = time.time()
            print('装饰器二号进行装饰alltime%f' % (end_time - start_time))
            return '<td>' + str(func(*args,**kwargs)) + '<td>'
    
        return inner
    
    #一个装饰器相当于闭包
    def set_func_1(func):
        def inner(*args,**kwargs):
            start_time = time.time()
            # #func(args,kwargs)#不行,相当于传递两个参数,一个元组,一个字典
            # # func(*args,**kwargs)#拆包
            end_time = time.time()
    
            print('装饰器一号进行装饰alltime%f' % (end_time - start_time))
            return '<h1>'+str(func(*args,**kwargs)) +'<h1>'
    
        return inner
    
    
    @set_func_1
    @set_func
    def f1(num):
        # print("__f1__%d" % num)
        return "__f1__%d" % num
    
    
    
    print(f1(100))
    执行结果:
    装饰器一号进行装饰alltime0.000001 装饰器二号进行装饰alltime0.000000 <h1><td>__f1__100<td><h1>

    由此我们可以看出装饰器的执行先后顺序,谁在上面谁先执行。

  • 相关阅读:
    浅谈 PHP 与手机 APP 开发(API 接口开发)
    Thinkphp+Nginx(PHPstudy)下报的404错误,403错误解决
    win7彻底卸载iis
    Java ByteCode 规格严格
    CPUID 规格严格
    Your First Plugin(转载) 规格严格
    SQLYog Enterprise注册码 规格严格
    WSUS API&&WUAPI 规格严格
    linux学习一则 规格严格
    Eclipse分析源代码时总是显示org.eclipse.core.runtime.CoreException错误,找不到***文件(转载) 规格严格
  • 原文地址:https://www.cnblogs.com/liangliangzz/p/11251260.html
Copyright © 2020-2023  润新知