# 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" % numprint(f1(100))

执行结果:装饰器一号进行装饰alltime0.000001
装饰器二号进行装饰alltime0.000000
<h1><td>__f1__100<td><h1>

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

转载于:https://www.cnblogs.com/liangliangzz/p/11251260.html

多个装饰器装饰一个函数相关推荐

  1. python装饰器原理-Python函数装饰器原理与用法详解

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

  2. python 装饰器装饰类_5分钟的Python装饰器指南

    python 装饰器装饰类 重点 (Top highlight) There's no doubt that Python decorators are one of the more advance ...

  3. python类方法调用装饰_Python3 @classmethod 函数装饰器 声明一个类方法

    Python3 @classmethod 函数装饰器 声明一个类方法 @classmethod函数装饰器的主要作用是将一个类的普通方法(需要实例化使用)声明为一个类方法(可以直接使用类名调用).在类的 ...

  4. Python什么是闭包、闭包特征、定义闭包传入一个数求和并输出,定义一个装饰器:打印函数运行花费的时间,定义一个类:要求:包含一个对象属性,且用_(单下划线)命名的定义一个类方法(装饰器)

    1. 闭包.闭包特征及应用 1.1 什么是闭包? 闭包就是外部函数中定义一个内部函数,内部函数引用外部函数中的变量,外部函数的返回值是内部函数; 闭包是由函数及其相关的引用环境组合而成的实体(即:闭包 ...

  5. 190401装饰器-高阶函数-闭包

    一.装饰器 装饰器本质是函数 为其他函数添加附加功能 不修改被修饰函数的源代码 不修改被修饰函数的调用方式 装饰器示例 import timedef timmer(func):def wrapper( ...

  6. python装饰器实例-Python函数装饰器--实例讲解

    一.装饰器定义: 1.装饰器的本质为函数: 2.装饰器是用来完成被修饰函数的附加功能的 所以:装饰器是用来完成被修饰函数附属功能的函数 装饰器的要求: 1.不能修改被修饰函数的源代码: 2.不能更改被 ...

  7. python turtle画气球-如何用python的装饰器定义一个像C++一样的强

    如何用python的装饰器定义一个像C++一样的强 Python作为一个动态的脚本语言,其函数在定义时是不需要指出参数的类型,也不需要指出函数是否有返回值.使用python的装饰器来定义一个像C++那 ...

  8. python装饰器函数-python装饰器1:函数装饰器详解

    先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函数 方法 类 基础:函数装饰器的表现方式 假如你已经定义了 ...

  9. python有参装饰器 多个装饰器装饰一个

    1.有参装饰器 基本版 def auth(argv):def wrapper(f):def inner(*args,**kwargs):f(*args,**kwargs)return innerret ...

  10. 装饰器 and 闭包函数 未完。。。。。

    装饰器是一个返回函数的高阶函数.装饰器=高阶函数+函数嵌套+闭包 装饰器需要遵循的原则:不修改被装饰函数的源代码,不修改被装饰函数的调用方式. 高阶函数 1.函数接收的参数是一个函数名 2.函数的返回 ...

最新文章

  1. 通过python的ConfigParse模块读写ini配置文件
  2. 菜菜从零学习WCF十(序列化)
  3. 非抢占式优先算法例题_非抢占式高优先级调度算法
  4. 浙江高校计算机等级考试二级办公,浙江省高校计算机等级考试二级(高级办公)试题12.ppt...
  5. (转载)从金岳霖到哥德尔
  6. 外卖菜谱小程序源码-带流量主功能-外卖领劵个人也可过审
  7. 11,EasyNetQ-调度事件与定时发布
  8. 通过手机物理返回键实现弹出层的隐藏
  9. 进阶!基于CentOS7系统使用cobbler实现单台服务器批量自动化安装不同版本系统(week3_day5_part2)-技术流ken...
  10. 第6章 vector向量容器
  11. 介绍数据库中的wal技术_简介事务ACID的实现机制
  12. 阿里云视频直播PHP-SDK接入教程
  13. Qt 自绘控件练习 太极八卦图
  14. vue 扁平化_JS数组扁平化(flat)
  15. ABAQUS常见错误(一)多根预应力钢绞线
  16. 智博联反射波测桩分析软件 V141125专业版
  17. 自编小程序,保持编程达人眼睛
  18. android广告弹窗插屏,cocos2dx android添加广点通广告平台的---插屏广告
  19. 如何快速学习一个开源框架
  20. 谷歌pay服务端文档_google支付后台验证操作流程

热门文章

  1. python socket 网络编程
  2. spring是如何管理 事务的
  3. Android----Fragments详解
  4. 《浅谈架构之路:前后端分离模式》
  5. Activemq源码、编译、导入idea、源码调试总结
  6. Laravel中的Blade模版
  7. 合并bin文件-----带boot发布版本比较好用的bat(便捷版)
  8. python 时间日期处理
  9. 动态代理,动态代理设计模式 ,JDK动态代理,cglib动态代理
  10. Walle 瓦力 web部署系统