多个装饰器装饰一个函数
# 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
多个装饰器装饰一个函数相关推荐
- python装饰器原理-Python函数装饰器原理与用法详解
本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...
- python 装饰器装饰类_5分钟的Python装饰器指南
python 装饰器装饰类 重点 (Top highlight) There's no doubt that Python decorators are one of the more advance ...
- python类方法调用装饰_Python3 @classmethod 函数装饰器 声明一个类方法
Python3 @classmethod 函数装饰器 声明一个类方法 @classmethod函数装饰器的主要作用是将一个类的普通方法(需要实例化使用)声明为一个类方法(可以直接使用类名调用).在类的 ...
- Python什么是闭包、闭包特征、定义闭包传入一个数求和并输出,定义一个装饰器:打印函数运行花费的时间,定义一个类:要求:包含一个对象属性,且用_(单下划线)命名的定义一个类方法(装饰器)
1. 闭包.闭包特征及应用 1.1 什么是闭包? 闭包就是外部函数中定义一个内部函数,内部函数引用外部函数中的变量,外部函数的返回值是内部函数; 闭包是由函数及其相关的引用环境组合而成的实体(即:闭包 ...
- 190401装饰器-高阶函数-闭包
一.装饰器 装饰器本质是函数 为其他函数添加附加功能 不修改被修饰函数的源代码 不修改被修饰函数的调用方式 装饰器示例 import timedef timmer(func):def wrapper( ...
- python装饰器实例-Python函数装饰器--实例讲解
一.装饰器定义: 1.装饰器的本质为函数: 2.装饰器是用来完成被修饰函数的附加功能的 所以:装饰器是用来完成被修饰函数附属功能的函数 装饰器的要求: 1.不能修改被修饰函数的源代码: 2.不能更改被 ...
- python turtle画气球-如何用python的装饰器定义一个像C++一样的强
如何用python的装饰器定义一个像C++一样的强 Python作为一个动态的脚本语言,其函数在定义时是不需要指出参数的类型,也不需要指出函数是否有返回值.使用python的装饰器来定义一个像C++那 ...
- python装饰器函数-python装饰器1:函数装饰器详解
先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函数 方法 类 基础:函数装饰器的表现方式 假如你已经定义了 ...
- python有参装饰器 多个装饰器装饰一个
1.有参装饰器 基本版 def auth(argv):def wrapper(f):def inner(*args,**kwargs):f(*args,**kwargs)return innerret ...
- 装饰器 and 闭包函数 未完。。。。。
装饰器是一个返回函数的高阶函数.装饰器=高阶函数+函数嵌套+闭包 装饰器需要遵循的原则:不修改被装饰函数的源代码,不修改被装饰函数的调用方式. 高阶函数 1.函数接收的参数是一个函数名 2.函数的返回 ...
最新文章
- 通过python的ConfigParse模块读写ini配置文件
- 菜菜从零学习WCF十(序列化)
- 非抢占式优先算法例题_非抢占式高优先级调度算法
- 浙江高校计算机等级考试二级办公,浙江省高校计算机等级考试二级(高级办公)试题12.ppt...
- (转载)从金岳霖到哥德尔
- 外卖菜谱小程序源码-带流量主功能-外卖领劵个人也可过审
- 11,EasyNetQ-调度事件与定时发布
- 通过手机物理返回键实现弹出层的隐藏
- 进阶!基于CentOS7系统使用cobbler实现单台服务器批量自动化安装不同版本系统(week3_day5_part2)-技术流ken...
- 第6章 vector向量容器
- 介绍数据库中的wal技术_简介事务ACID的实现机制
- 阿里云视频直播PHP-SDK接入教程
- Qt 自绘控件练习 太极八卦图
- vue 扁平化_JS数组扁平化(flat)
- ABAQUS常见错误(一)多根预应力钢绞线
- 智博联反射波测桩分析软件 V141125专业版
- 自编小程序,保持编程达人眼睛
- android广告弹窗插屏,cocos2dx android添加广点通广告平台的---插屏广告
- 如何快速学习一个开源框架
- 谷歌pay服务端文档_google支付后台验证操作流程