当前位置: 首页 > 编程日记 > 正文

python之函数三装饰器

装饰器形成的过程

装饰器的作用:不想修改函数的调用方式,但是还想在原来的函数前后加功能

原则:开发封闭原则

开发:对扩展是开发的

封闭:对修改是封闭的

装饰器的固定模式

计算运行时间

 1 import time
 2 # time.time()获取当前时间
 3 # time.sleep(5)让程序在执行到这个位置的时候停一会儿
 4 
 5 
 6 def timer(f):#func地址 ;装饰器函数
 7     #闭包
 8     def inner():
 9         start=time.time()
10         ret=f()#被装饰的函数
11         end=time.time()
12         print(end-start)
13         return ret
14     return inner
15 @timer    #语法糖  @装饰器函数名
16 # func=timer(func)#就等于@timer
17 def func():#被装饰的函数
18 #     start=time.time()
19     print(1)
20     time.sleep(0.01)
21 #     end=time.time()
22 #     print(end-start)
23     return '新年好'
24 ret=func()#实际执行的是inner
25 print(ret)

timer就是一个装饰器函数,只是对一个函数有装饰作用

装饰带参数函数的装饰器

 1 #装饰带参数函数的装饰器
 2 import time
 3 def timer(f):#func地址 ;装饰器函数
 4     #闭包
 5     def inner(*args):
 6         start=time.time()
 7         ret=f(*args)#被装饰的函数
 8         end=time.time()
 9         print(end-start)
10         return ret
11     return inner
12 @timer    #语法糖  @装饰器函数名
13 def func(a):#被装饰的函数
14     print(1,a)
15     time.sleep(0.01)
16     return '新年好'
17 @timer    #语法糖  @装饰器函数名
18 def func1(a,b):#被装饰的函数
19     print(1,a,b)
20     time.sleep(0.01)
21     return '新年好'
22 
23 ret=func1(1,2)#实际执行的是inner
24 ret1=func(1)
25 #func()#实际执行的是inner
26 print(ret)
27 print(ret1)

固定格式

def wrapper(f):#f被装饰的函数,wrapper就是装饰def inner(*args,**kwargs):#定义一个其他函数#在被装饰函数之前要做的事ret=f(*args,**kwargs)#被装饰的函数,被装饰的函数执行#在被装饰函数之后要做的事return retreturn inner#不加()

@wrapper    #语法糖  @装饰器函数名
def func1(a,b):#被装饰的函数time.sleep(0.01)print(1,a,b)return '新年好'

装饰器进阶

 1 def wrapper(func):  #func = holiday
 2     def inner(*args,**kwargs):
 3         print('在被装饰的函数执行之前做的事')
 4         ret = func(*args,**kwargs)
 5         print('在被装饰的函数执行之后做的事')
 6         return ret
 7     return inner
 8 
 9 @wrapper   #holiday = wrapper(holiday)
10 def holiday(day):
11     '''这是一个放假通知'''
12     print('全体放假%s天'%day)
13     return '好开心'
14 
15 print(holiday.__name__)
 1 # 装饰器进阶
 2     # functools wraps
 3 from functools import wraps
 4 def wrapper(func):#f被装饰的函数,wrapper就是装饰
 5     @wraps(func)#
 6     def inner(*args,**kwargs):
 7         print('在被装饰的函数执行之前做的事')
 8         ret = func(*args,**kwargs)
 9         print('在被装饰的函数执行之后做的事')
10         return ret
11     return inner
12 @wrapper    #语法糖  @装饰器函数名
13 def holiday(day):
14     '''这是一个放假通知'''
15     print('全体放假%s天'%day)
16     return '好开心'
17 print(holiday.__name__)
18 print(holiday.__doc__)
19 ret = holiday(3)   #inner
20 print(ret)
21     #带参数的装饰器
22 #   多个装饰器装饰同一个函数
23 
24 # 函数名.__name__查看字符串格式的函数名
25 # 函数名.__name__#document查看函数的注释

 1 #带参数的装饰器
 2 #500个函数
 3 import time
 4 FLAGE = False
 5 def timmer_out(flag):
 6     def timmer(func):
 7         def inner(*args,**kwargs):
 8             if flag:
 9                 start = time.time()
10                 ret = func(*args,**kwargs)
11                 end = time.time()
12                 print(end-start)
13                 return ret
14             else:
15                 ret = func(*args, **kwargs)
16                 return ret
17         return inner
18     return timmer
19 # timmer = timmer_out(FLAGE)
20 @timmer_out(FLAGE)    #@timer #wahaha = timmer(wahaha)
21 def wahaha():
22     time.sleep(0.1)
23     print('wahahahahahaha')
24 
25 @timmer_out(FLAGE)
26 def erguotou():
27     time.sleep(0.1)
28     print('erguotoutoutou')
29 wahaha()
30 erguotou()
#多个装饰器装饰一个函数
def wrapper1(func):def inner1():print('wrapper1 ,before func')ret = func()print('wrapper1 ,after func')return retreturn inner1def wrapper2(func):def inner2():print('wrapper2 ,before func')ret = func()print('wrapper2 ,after func')return retreturn inner2def wrapper3(func):def inner3():print('wrapper3 ,before func')ret = func()print('wrapper3 ,after func')return retreturn inner3@wrapper3
@wrapper2
@wrapper1
def f():print('in f')return '哈哈哈'print(f())#记录用户的登录情况
#计算这个函数的执行时间

转载于:https://www.cnblogs.com/xk66d/p/10822318.html

相关文章:

Boom Library 93套影视游戏无损配乐音效素材合集包

Boom Library 93套影视游戏无损配乐音效素材合集包 素材压缩包大小共:851G 每个合集为独立压缩包 可选择性下载 云桥网络 平台获取合集包 01.BOOM Library Assault Weapons Bundle【枪战机枪音效】 02.BOOM Library Birds of Prey【猛禽类音效】 03.BOOM Librar…

将数据追加到html 表格中,将数据添加到数据表中

将数据添加到数据表中03/30/2017本文内容在创建 DataTable 并使用列和约束定义其结构之后,您可以将新的数据行添加到表中。 要添加新行,可将一个新变量声明为 DataRow 类型。 当调用方法时,将返回新的 DataRow 对象 NewRow 。 然后&#xff0…

WIN7源码安装Apache和PHP注意事项

安装注意事项。 你注意下下载PHP,Apache的网站,上面有提示要安装Visual C库的。 Apache2.4.4需要VC10库支持,Microsoft Visual C 2010 SP1 Redistributable Package (x64) PHP5.6需要VC11库支持,Visual C Redistributable for Vis…

2022-2028年中国卫星导航行业深度调研及投资前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国卫星导航行业市场行业相关概述、中国卫星导航行业市场行业运行环境、分析了中国卫星导航行…

TypeKit ,use online fonts

TypeKit ,use online fonts 相信做UI的同学们经常会碰到字体的取舍问题为了页面的兼容性经常要写像下面的 <style type"text/css">body {font-family: "dejavu sans mono",Arial,Georgia,serif;} </style> 如果想用比较美观的不常见的字体只能…

详解mybatis的insert,update,delete返回值

为什么要提数据的事呢,是因为据说这个save返回的就是插入的数据的条数。但是遗憾的是,我们的这个user怎么能没有id呢,没有id有怎么查,怎么删,怎么改。进来的是没有id的user,出去的是有id的user,真是太厉害了,没想到不仅把返回值改变了,连参数都发生了改变,真是太神奇了。keyProperty=“id” 这是id就是绑定的id,那我就疑惑了,这绑定的哪个id啊。这样一搞,如果插入成功的话返回的是1,如果不成功的话返回的是-1。我让你删id是222222的,我还没创建呢,看你怎么删。

Java--Iterator迭代器(集合的遍历)

在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,指向第一个元素,当第一次调用迭代器的next方法时,返回第一个元素,然后迭代器的索引会向后移动一位,指向第二个元素,当再次调用next方法时,返回第二个元素,然后迭代器的索引会再向后移动一位,指向第三个元素,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。

【Stream流】Sort排序详解

很多时候由于需求的复杂性,很多直接从数据库查出的数据并不能直接返回前端,需要进行处理,处理之后又需要排序,这时候一般都会使用Stream流的Sort排序。

使用CruiseControl.Net全面实现持续集成

持续集成想必大家很多人都听说过&#xff0c;甚至都实践过&#xff0c;最近我又一次亲历了一次持续集成&#xff0c;现将我的经验分享给大家。关于持续集成的理论在本文概不涉及&#xff0c;本文的主要目的是实战CruiseControl.Net&#xff0c;用它来全面实现持续集成。 在配置…

Blender三维建模和动画风格化的东方场景视频教程

Blender三维建模和动画风格化的东方场景-Blender 3D Modelling & Animating A Stylized Oriental Scene Blender三维建模和动画风格化的东方场景-Blender 3D Modelling & Animating A Stylized Oriental Scene 时长:23h 40m | .MP4 1280720&#xff0c;30 fps(r) | A…

一条直线上N个线段所覆盖的总长度

转自http://blog.csdn.net/bxyill/article/details/8962832 问题描述&#xff1a; 现有一直线&#xff0c;从原点到无穷大。 这条直线上有N个线段。线段可能相交。 问&#xff0c;N个线段总共覆盖了多长&#xff1f;(重复覆盖的地区只计算一次) 解题思路&#xff1a; 可以将每…

html根据字段制作曲线图,canvas制作简单的HTML图表,折线或者矩形统计(原创)

插件描述&#xff1a;canvas制作简单的HTML图表&#xff0c;折线或者矩形统计 使用canvas制作简单的HTML图表&#xff0c;折线或者矩形统计。使用canvas制作简单的HTML图表&#xff0c;折线或者矩形统计&#xff0c;简单而实用。图形由 Ctable类创建&#xff0c;类我已经写好了…

联合索引最左匹配原则成因

使用col3,col2,col1 顺序建立联合索引&#xff0c;通过col3的值建立一个btree &#xff0c;通过关键值去查找“Alice”&#xff0c;在叶子节点中找到两个“Alice”,那么“Alice”对于col2、col1对应的值&#xff0c;那么会对col2&#xff0c;col1分别进行一个有序的排列&#x…

二 IOC之PropertyPlaceholderConfigurer

2019独角兽企业重金招聘Python工程师标准>>> 老长一段时间没有看文档了&#xff0c;今天看到这个PropertyPlaceholderConfigurer有点意思&#xff0c;我于百忙之中抽出点时间&#xff0c;将这个点记录在这里&#xff0c;方便日后慢慢完善&#xff0c;慢慢深入。 因为…

关于Linux服务器磁盘空间占满问题的解决方法

下面给大家分享一篇关于Linux服务器磁盘占满问题解决方法&#xff08;/dev/sda3 满了&#xff09;&#xff0c;需要的的朋友参考下吧下面我们一起来看一篇关于Linux服务器磁盘占满问题解决&#xff08;/dev/sda3 满了&#xff09;&#xff0c;希望碰到此类问题的人能带来帮助。…

Maya人物角色行走动画制作视频教程

Maya人物角色行走动画制作视频教程 Maya人物角色行走动画制作视频教程 持续时间2h 57m 包含项目文件 1920X1080 MP4 大小解压后&#xff1a;2.27G 标题:技能分享–在Maya制作专业行走动画 云桥网络 平台 huo取 教程 信息: 这门课程是为初学者设计的&#xff0c;他们理解工作…

细数技术指标-[转载]

技术指标类别庞杂&#xff0c;要一一学全&#xff0c;基本不可能&#xff0c;也没有这个必要。我们只要掌握几个常用的指标&#xff0c;了解它们的原理&#xff0c;从而举一反三&#xff0c;就足够了。其实任何一种技术指标都是从形态、价格、量、时间这四项出发的&#xff0c;…

html无序列表的滚动效果,html无序列表标签和有序列表标签使用示例

原标题&#xff1a;html无序列表标签和有序列表标签使用示例一、上下层列表标签:&#xff1a;上层dt下层dd&#xff1a;封装的内容会被自动缩进的效果复制代码代码如下:运动户外板鞋篮球鞋足球鞋跑步鞋二、定义有序列表: 属性&#xff1a;type&#xff1a; 可以设置排序的样式 …

2022-2028年中国微藻行业市场调查研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国微藻行业市场行业相关概述、中国微藻行业市场行业运行环境、分析了中国微藻行业市场行业的…

cocos2dx 优化略记

缓存cache: 预加载资源到内存, 可以异步加载. 直接使用sprite:create()来加载资源的话, 有时候会发现, 在第一次运行动作的时候会变的很卡. 那是因为第一次要加载资源到内存, 加载资源到内存这个过程会比较的慢. 资源较大的话, 明显的会感觉到卡帧 批次渲染: 100个相同的…

关于AD编程的一些资料

有人问我怎样在.NET下操作AD对象&#xff0c;找了些资料和Sample&#xff0c;留作备用。 .NET Framework Class Library: System.DirectoryServices Namespace http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemdirectoryservices.asp How to poll for changes …

Blender和Substance Painter制作科幻装甲视频教程

Blender和Substance Painter制作科幻装甲视频教程 时长7小时 1280X720 MP4 题目&#xff1a;《技能共享》--用Blender和Substance Painter绘制科幻盔甲 流派:电子学习| MP4 |视频:h264&#xff0c;1280x720 |音频:AAC&#xff0c;48.0 KHz 语言&#xff1a;英语中英文字幕&…

Linux wait() 和 waitpid()函数介绍

转载自http://blog.csdn.net/wallwind/article/details/6998602 当一个进程正常或异常终止的时候&#xff0c;内核就像其父进程发送SIGCHLD信号&#xff0c;因为子进程是个一步事件&#xff0c;所以这种信号也是内核系那个父进程发的异步通知。父进程可以选择忽略该信号&#x…

jq修改iframe html代码,jQuery控制iFrame(实例代码)

用jquery在IFRAME里取得父窗口的某个元素的值只好用DOM方法与jquery方法结合的方式实现了1.在父窗口中操作 选中IFRAME中的所有单选钮$(window.frames["iframe1"].document).find(”input[typeradio]“).attr(”checked”,”true”);2.在IFRAME中操作 选中父窗口中的…

索引是建的越多越好吗?

索引是建的越多越好吗&#xff1f; 明显不是&#xff0c;有以下几点&#xff1a; 数据量小的表不需要建立索引&#xff0c;建立会增加额外的索引开销不经常引用的列不要建立索引&#xff0c;因为不常用&#xff0c;即使建立了索引也没有多大意义。对经常用于查询的字段应该创…

TFS数据迁移之sync_by_blk

本文档记录了两套tfs 2.2.16系统之间的数据迁移过程。Source环境介绍&#xff1a;Tfs 主nameserver: 192.168.1.225/24 (vip 229)Tfs 从nameserver: 192.168.1.226/24 Tfs data server 1: 192.168.1.226/24 &#xff08;启动三个挂载点,每个挂载点分配20G空间&#xff09;Tfs …

阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第5节 final关键字_5_final关键字用于修饰成员变量...

直接这么修饰成员变量就会报错。这里必须要手动赋值&#xff0c;因为string name这里的默认是值null。一但默认值以后就不能后续再赋值了。所以这里强制你必须要手动赋值。 给name赋值后。后面所有的代码 尝试给name赋值的地方都报错了。 通过构造进行赋值。 构造有两个一个有参…

Blender 和Unreal Engine中的模块化3D建筑技能学习视频教程

Blender 和Unreal Engine中的模块化3D建筑技能学习视频教程 流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;48.0 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕翻译更准确&#xff09; |大小解压后:3.17 GB |时长:5h 42m 用Blen…

$().html()对ie9无效,不注意这点,\9和\0就可能对hack IE11\IE9\IE8无效

每次设计一张网页或一个表单&#xff0c;都被各种浏览器的兼容问题伤透脑筋&#xff0c;尤其是IE家族。在做兼容性设计时&#xff0c;我们往往会使用各种浏览器能识别的独特语法进行hack&#xff0c;从而达到各种浏览器下显示正常的目的。其中&#xff0c;我们用得最多莫属于\9…

MPC8313ERDB不新鲜pkg包裹,把文件放进Ramdisk

MPC8313ERDB不新鲜pkg包裹&#xff0c;把文件放进Ramdisk 经ltib编译器生成rootfs.ext2.gz.uboot它可以直接uboot采用。假设我们编写了相应的外部文件把Ramdisk往里走。您可以创建一个pkg包裹。然后配置编译&#xff08;&#xff0c;。&#xff0c;&#xff09;。当然这样的方法…