Python小白学习之函数装饰器
装饰器
2018-10-25 13:49:37
装饰器从字面意思就是用来装饰的,在函数可以理解为:在函数中,我们不想影响原来的函数功能,又想给函数添加新的功能,这时候我们就用到了装饰器。
一般函数操作(不用装饰器):
import time
print(time.time())
def i_can_sleep():
time.sleep(3)
start = time.time()
i_can_sleep()
stop = time.time()
print("函数运行了%s"%(stop - start))
执行结果:

使用装饰器:
下面程序分为4步走(外部函数、返回嵌套函数、嵌套函数+语法糖(@装饰函数简写)+被装饰函数+调用被装饰的函数);若有大量的调用函数i_can_sleep并查看程序运行了多长时间,我们就嘚不厌其烦的定义新的start和stop变量,然后打印时间
为此,我们就需要更简单的方法,装饰器,把这些重复的工作封装到装饰函数中也就是封装到@装饰函数名(语法糖)
代码如下:
###################################
import time
def timer(fun):#参数是我们要传入的被装饰函数,记下面的i_can_sleep函数 #1
#此处我们需要在函数内部再定义一个内部函数,即嵌套函数
def decorator():
start = time.time()
fun() #调用被装饰的函数,下面的i_can_sleep()
stop = time.time()
print('被装饰的函数i_can_sleep程序执行时间为:',stop-start) #给被装饰函数添加计时器功能
return decorator
@timer #装饰函数 # 2
def i_can_sleep():#我们要装饰的函数,即被装饰函数 # 3
time.sleep(3)
i_can_sleep() #最后一步调用程序 # 4
# 其实上面的第四部也可以按下面写,只是装饰器简化下面的步骤。
#next = timer(i_can_sleep);next()
执行结果如下:

可以看到执行结果和不使用装饰器一样的。看上去使用装饰器复杂了,实际上,对于大量执行计时器操作,就不用重复定义变量并打印结果了,我们使用装饰器只需改变少量实参即可即可省去重复操作,因为我们把一部分重复操作封装在装饰函数中,@装饰函数名。 带参数的被装饰函数上面是不带参数的装饰器,下面是带参数的装饰器,注意:1、参数放在内部函数中#1;2、被装饰的函数也要加上参数 看#2;定义被装饰的函数有参数看#3、#4。3、定义被装饰函数时(语法糖下面的函数是被装饰函数),形参名字和上面的嵌套函数可以不一致。
print("---------------------------------------------------")
# 带参数的装饰器
def wai(func):
def nei(a,b): #参数放在内部函数中 #1
print('start')
func(a,b) #被装饰函数调用也要加上参数 #2
print('stop')
return nei
@wai
def add(m,n): #加法 #3
return print(m+n) #参数名和嵌套函数中的参数名字可以不同。
add(,)
# 可以多次使用语法糖调用装饰器
@wai
def sub(x,y): #减法 #4
return print(x-y)
sub(,)
执行结果如下:

带参数的装饰器(带参数的语法糖)
不改变内部被装饰函数,通过在语法糖(@装饰函数名)后面添加实参和并且在装饰函数再加一层外层函数
def add_chars(argv):
def wai(func):
def nei(a,b):
print('开始:%s'%argv)
func(a,b)
print('结束')
return nei
return wai
@add_chars('加法') #语法糖名字要和多层嵌套函数最外层函数名一致,并且参数对应最外层函数形参
def add(m,n):
return print(m,'+',n,'=',m+n)
add(4,6)
@add_chars('减法') #
def sub(x,y): #减法
return print(x,'-',y,'=',x-y)
sub(11,4)
# 装饰器带参数;在语法糖上带参数
# 可以看到一层嵌套函数,出入的参数满了,我们可以在最外面加一层嵌套函数
执行结果如下:

小白学习笔记,如有理解错误,望批评指正,大佬止步。
Python小白学习之函数装饰器的更多相关文章
- python语言中的函数装饰器
装饰器 什么是装饰器? 装饰:给已有的对象(函数)添加新的功能 器:工具 在python中指具备某些功能的函数 装饰器:装饰器就是一个给其他函数增加功能的函数 一种设计原则: ...
- Python: 无参数的函数装饰器
写带参数的函数装饰器最纠结的是需要包好多层,最外层是接收参数的函数,它返回一个接收函数的的函数.但这样有个问题是,最终包装出来的装饰器必须加()调用一下,即使没有参数也需要这样做,因为调用这个最外层函 ...
- Python带参数的函数装饰器
# -*- coding: utf-8 -*- # author:baoshan # 带参数的函数装饰器 def say_hello(country): def wrapper(func): def ...
- 流畅的python第七章函数装饰器和闭包学习记录
本章讨论的话题 python如何计算装饰器句法 python如何判断变量是不是局部的(通过函数内部是否给变量赋值过来判断是否是局部变量) 闭包存在的原因和工作原理(闭包是一种函数,它会保留定义函数时存 ...
- python之路(九)-函数装饰器
装饰器 某公司的基础业务平台如下: def f1(): print('这是f1业务平台') def f2(): print('这是f2业务平台') def f3(): print('这是f3业务平台' ...
- python基础学习1-双层装饰器(实现登陆注册)
LOGIN_USER = {"IsLogin":False} def check_login(func): #检查登陆的装饰器 def inner(*args,**kwargs): ...
- 【Python入门学习】闭包&装饰器&开放封闭原则
1. 介绍闭包 闭包:如果在一个内部函数里,对在外部作用域的变量(不是全局作用域)进行引用,那边内部函数被称为闭包(closure) 例如:如果在一个内部函数里:func2()就是内部函数, 对在外部 ...
- python学习日记(函数--装饰器)
楔子 前提,我有一段代码(一个函数). import time def run_time(): time.sleep(0.1) print('我曾踏足山巅') 需求1:现在,我想计算这段代码的运行时间 ...
- Python学习日记(九) 装饰器函数
1.import time a.time.time() 获取到当前的时间,返回值为浮点型 import time print(time.time()) #1565422783.6497557 b.ti ...
随机推荐
- seek()和tell()在文件里转移
Seek()方法允许在输入和输出流移动到任意的位置,seek()有好几种形式.包含:seekp() 方法和seekg()方法,p是put的意思,g是get的意思:其中输入流里用seekg()函数,输出 ...
- MFC文档应用程序CToolBar:设置两个工具条并列停靠到同一条边上 转
转自:http://blog.csdn.net/panshiqu/article/details/9369891# 将多个工具条同时并列停靠在某窗口的某一条边上.对于这种停靠方法,利用上述工具条控制函 ...
- PPP interface for lwIP
//原文 地址 :http://www.nongnu.org/lwip/2_0_x/group__ppp.html /* //协议说明,2017年6月29日14:19:18,suozhang PPP ...
- tomcat启动错误org.springframework.beans.factory.CannotLoadBeanClassException的解决
tomcat启动时一直报这个错误,但是报错的类确实存在. 清空tomcat,更新maven项目,重配tomcat都没有解决. 最后解决办法: Eclipse环境:Project-->clean ...
- linux SVN添加新用户
首先找到用户文件:authz.conf; 用vi 编辑authz.conf文件在develps 后面添加你要添加的用户名:如图: 上图:cheny就是我后面添加上去的用户名 按Esc :wq保存au ...
- SQL Server 数据收缩
1. 数据库的相关属性 在MS中创建数据库时会为数据库分配初始的大小(如下图:数据库和日志两个文件),随着数据库的使用文件会逐渐增大.数据库文件大小的增加有两种方式: 自动增长:在自动增长中可以设置每 ...
- oracle自动冷备份脚本
根据自己网上的资料和自己的需求,写的oracle冷备份脚本. 整体思路: 1.停止服务 2.文件拷贝 3.启动服务 保存以为文件为BAT格式,点击可以用下. rem ----------------- ...
- UIImage指定区域自由拉伸
UIImage的 resizableImageWithCapInsets 可以指定需要拉伸的位置,这个方法很有用,可以减少长短按钮数量
- vue面试题!!!
由于公司需要,需要把项目拆分,前端使用vue框架.最近面试vue总结的试题 1:mvvm框架是什么?它和其他框架的区别是什么? mvvm 全称model view viewModel,model数据模 ...
- shell习题第3题:统计内存大小
[题目要求] 写一个脚本计算一下linux系统所有进程占用内存的大小的和 [核心要点] ps命令用法 for循环 加法运算 [脚本] #!/bin/bash for n in `ps aux | gr ...