多个装饰器装饰一个函数

# 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WKInterfaceImage 无法更新图片的问题

最近涉及到AppleWatch的相关项目&#xff0c;但有个奇怪问题无法解决&#xff0c;而且无法理解&#xff1a; 根据不同的用户操作&#xff0c;需要修改播放器的专辑图片。 不知道跟我的项目需求是不是有关系&#xff1a;我需要轮询共享空间&#xff0c;以拿取同步数据&#xff0…

LeetCode—美团2021秋招 006、007、008、009

美团2021秋招 006 小团的神秘暗号、007 小团的选调计划、008 小团无路可逃、009 小团的装饰物 题目描述&#xff1a; [006] 小团深谙保密工作的重要性&#xff0c;因此在某些明文的传输中会使用一种加密策略&#xff0c;小团如果需要传输一个字符串 S &#xff0c;则他会为这个…

POJ1390 Blocks——动态规划——pku1390

经典的动态规划&#xff0c;LRJ神牛的书上经典例题第一题。 开一个三维数组,f[i][j][k]表示将i~j这一段&#xff0c;连上后面的k个格子全部消去所能够获得的最大价值。 状态转移方程&#xff1a; f[i][j][k]Max{ Max{f[i][p][len[j]k]f[p1][j-1][0]}(color[p]color[j] and i<…

最大子矩阵求法详解

最大子矩阵&#xff08; $ s^2 $ 枚举障碍与 $ n \times m $ 悬线法&#xff09; 题目大意&#xff1a; 有 $ s $ 个障碍分布在一个 $ n\times m $ 的矩阵中。现在让你找出其中不包含任何一个障碍的最大子矩阵。 首先我们要引进一个新概念&#xff1a;&#xff08;极大子矩阵&a…

SQLSERVER数据仓库的构建与分析

实例构建过程与分析 1&#xff0e;现在以一个比较简单的实例来分析和探讨MS SQL SERVER 数据仓库的构建过程。实际上数据仓的构建是相当复杂的&#xff0c;他结合了数据仓库的前端技术和很强的业务要求。在这儿只是以一个简单的实例来说明他大致的构建流程。 2&#xff0e;构建…

基于Layui实现的树形菜单页面

基于Layui实现的树形菜单页面具体方法实现方法一&#xff1a;针对Layui模板的前后端统一更新1. 删除2. 添加3. 后端方法二&#xff1a;基于Dtree实现的纯前端树形增删改文中的组件地址具体方法实现 实现树形菜单&#xff0c;本文将给出两种实现方式。 针对Layui前端模板EasyW…

POJ 1723 Soldiers (中位数)

$ POJ~1723~Soldiers $ (中位数) $ solution: $ 这道题说难也不算太难&#xff0c;但是当时自己想的很矛盾。所以还是列一篇题解。 这道题首先比较容易看出来的就是&#xff1a;行和列是两个分开的问题&#xff0c;而且行的移动就是一个仓库选址的板子&#xff0c;直接求中位数…

php中时间轴开发,即显示为“刚刚”、“5分钟前”、“昨天10:23”等

php中时间轴开发&#xff0c;即显示为“刚刚”、“5分钟前”、“昨天10:23”等 其实这个没什么技术含量&#xff0c;当然就直接贴代码&#xff0c;不废话了&#xff08;合肥旅游网&#xff09;&#xff0c; 但是在其实开发中还是蛮有用的&#xff0c;譬如论坛帖子&#xff0c;围…

(一)Windows环境下汇编编程读书笔记

看了一节关于80x86系列处理器简史&#xff0c;不知道云里和雾里&#xff0c;什么晶体管啊&#xff0c;什么什么之类的不知道云里和雾里&#xff0c;看了讲什么都不知道啊&#xff01; 转载于:https://www.cnblogs.com/Nuxgod/articles/692990.html

我的读书清单(持续更新)

我的读书清单&#xff08;持续更新&#xff09; 2017-05-31 《一千零一夜》2006&#xff08;四五年级&#xff09;《中华上下五千年》2008&#xff08;初一&#xff09;《鲁滨孙漂流记》2008&#xff08;初二&#xff09;《钢铁是怎样炼成的》2009&#xff08;初二&#xff09;…

Docker知识点总结及其命令的使用

DockerDocker简介Docker与Tomcat有什么区别&#xff1f;Docker与虚拟机有什么区别&#xff1f;Docker的基本组成Docker的联合文件系统Docker基本命令Docker中的几个重要组件一、容器数据卷二、Dockerfile三、Docker网络虚拟机共享网络的三种方式Docker共享网络的四种方式Docker…

主题:Spring注解入门(转载)

原文链接&#xff1a;http://www.iteye.com/topic/295348 1. 使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的 类的实现&#xff1a; Java代码 public class UserManagerImpl implements UserManager { private UserDao userDao; public void …

sql触发器

在SQL Server里面也就是对某一个表的一定的操作&#xff0c;触发某种条件&#xff0c;从而执行的一段程序。触发器是一个特殊的存储过程。 常见的触发器有三种&#xff1a;分别应用于Insert , Update , Delete 事件。 我为什么要使用触发器&#xff1f;比如&#x…

XDJM的情意比山高,比海深!!

又是兄弟姐妹们帮我提前过的生日&#xff0c;我们这帮人从SC出来后还没好好聚过&#xff0c;乘这个机会把大家约了出来。星期五整整一天都很快乐&#xff0c;特别是我&#xff0c;NANA&#xff0c;小乔期待着晚上的聚餐&#xff0c;期待着金贸的蛋糕&#xff0c;嘿嘿。。他们好…

最大子矩阵和

最大子矩阵和 $ n^3 $ 算法 $ solution: $ 首先我们不难想到枚举上下左右边界&#xff0c;然后两层循环统计权值和&#xff0c;复杂度 $ O(n^6) $ 。这个我们用前缀和可以省去后面的循环&#xff0c;将复杂度降成 $ O(n^4) $ 。然后我们考虑不枚举上下左右四个边界&#xff0c;…

Springfox-swagger使用详解

Springfox-swagger使用详解什么是Swagger&#xff1f;Swagger的具体使用一、导入依赖二、建立Swagger配置类三、通过Swagger测试接口引用什么是Swagger&#xff1f; 是一个开源的API Doc的框架可以将我们的Controller中的API方法以文档的形式展现&#xff0c;并支持为其添加注…

Android中调用系统已安装的播放器来播放网络流媒体视频

2019独角兽企业重金招聘Python工程师标准>>> 实现思路比较简单几行代码就可以搞定&#xff0c;在界面放一个Button或者带有播放图标的imageview&#xff0c;点击事件中调用本地播放器来播放。 Uri uri Uri.parse("http://218.200.69.66:8302/upload/Media/20…

繁体机文本转换

Encoding big5 Encoding.GetEncoding("big5");Encoding abc Encoding.Default;string s "い瓣.約狥 ";byte[] t Encoding.Convert(big5,abc,abc.GetBytes(s));MessageBox.Show( abc.GetString(t));转载于:https://www.cnblogs.com/frhua/archive/2007/…

数据批量写入

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;using System.Reflection;using System.Collections;namespace SQLBulkInsertTest{/// <summary>/// 测试数据批量插入 By RhythmK…

WireShark详解

WireShark详解Wireshark介绍Wireshark使用一、基础数据说明二、指定数据包过滤Wireshark安装Wireshark介绍 Wireshark是一款可以运行在多平台的网络抓包工具&#xff0c;可以嗅探通过本机网卡的各类网络包&#xff0c;并对它们的协议&#xff0c;源、目标地址等多种数据进行解…