python 学习笔记7(装饰器)
闭包(closure)是函数式编程的重要的语法结构。
定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).
def outer(): x = 1 def inner(): print(x) return inner f = outer() f()
inner就是内部函数,inner里引用了外部作用域的变量x(x在外部作用域outer里面,不是全局作用域),则这个内部函数inner就是一个闭包。
闭包=函数块+定义函数时的环境,inner就是函数块,x就是环境。
装饰器
装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。
它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等应用场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
简单的装饰器函数:
@符号是装饰器的语法糖,在定义函数的时候使用,避免再一次赋值操作
import time def shoe_time(f):def inner():start = time.time()f()end = time.time()print(end-start)return inner @shoe_time #foo = shoe_time(foo) def foo():#start = time.time()print("foo......")time.sleep(2)#end = time.time()#print(end-start) #2.0001144409179688 #foo() @shoe_time #bar = shoe_time(bar) def bar():# start = time.time()print("bar......")time.sleep(3)#end = time.time()#print(end-start) #3.001171588897705 #bar() #shoe_time(foo) #2.0001142024993896 #shoe_time(bar) #3.001171588897705 foo() #foo...... # 2.0001144409179688 bar() # bar......# 3.00017142295837
带参数的被装饰函数
#功能函数加参数 import time def shoe_time(f):def inner(x,y):start = time.time()f(x,y)end = time.time()print(end-start)return inner @shoe_time def add(a,b):print(a+b)time.sleep(3) #@shoe_time # def foo(): # print("foo......") # time.sleep(2) # @shoe_time # def bar(): # print("bar......") # time.sleep(3) # add(1,3) #4#3.000171661376953#不定长参数 import time def shoe_time(f):def inner(*x,**y):start = time.time()f(*x,**y)end = time.time()print(end-start)return inner @shoe_time def add(*a,**b):sum = 0for i in a:sum += iprint(sum)time.sleep(3) #@shoe_time # def foo(): # print("foo......") # time.sleep(2) # @shoe_time # def bar(): # print("bar......") # time.sleep(3) # add(1,3,4,6,78) #92#3.000171661376953
带参数的装饰器
装饰器还有更大的灵活性,例如带参数的装饰器:在上面的装饰器调用中,比如@shoe_time,该装饰器唯一的参数就是执行业务的函数。装饰器的语法允许我们在调用时,提供其它参数,比如@decorator(a)。这样,就为装饰器的编写和使用提供了更大的灵活性。
#带参数的装饰器import time def logger(flag=""):def shoe_time(f):def inner(*x,**y):start = time.time()f(*x,**y)end = time.time()print(end-start)if flag == "true":with open("日志记录", "a",encoding="utf8") as g:g.write("值为: %s 时间为: %s\n"%(f(*x),(end-start)))return innerreturn shoe_time @logger("true") #@show_time def add(*a,**b):Sum = 0for i in a:Sum += iprint(Sum)time.sleep(3)return Sum @logger("abc") def foo():print("foo......")time.sleep(2) # @shoe_time # def bar(): # print("bar......") # time.sleep(3) add(1,3,4,6,78) #92#3.000171661376953 foo()
@logger("true") 做了两件事:
(1)@ogger("true"):得到闭包函数show_time,里面保存环境变量flag
(2)@time :add=show_time(add)
上面的logger是允许带参数的装饰器。它实际上是对原有装饰器的一个函数封装,并返回一个装饰器(一个含有参数的闭包函数)。当我 们使用@logger("true")调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中。
转载于:https://www.cnblogs.com/lst1010/p/5851643.html
python 学习笔记7(装饰器)相关推荐
- [转载] Python学习笔记——用装饰器decorator和Memoization记忆化提高效率,原理讲清楚了
参考链接: 在Python中使用装饰器进行记忆 Python学习笔记--用装饰器decorator和Memoization记忆化提高效率 装饰器Memoization记忆化运用`functools`中 ...
- python学习笔记(装饰器、迭代器生成器、内置函数、软件目录开发规范)
装饰器 定义:本质是函数,(功能:装饰其他函数):就是为其他函数添加附加功能 模拟场景一,在现有的函数中增加某个功能.现有的做法是定义新函数,并且加入函数中.需要修改源代码. def logger() ...
- Python学习笔记:装饰器
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- [转载] python学习笔记——@property装饰器
参考链接: Python @property装饰器 上篇:https://blog.csdn.net/qq_42489308/article/details/89423412 @property装饰器 ...
- python学习笔记之——装饰器及对象
1.反射之__import__ 我们知道import语句是用来导入外部模块的,当然还有from...import...也可以,但是其实import实际上是使用builtin函数__import__来工 ...
- python学习笔记之装饰器、递归、算法(第四天)
参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...
- python文件下载速度 装饰器_python学习笔记之---装饰器
# -*- coding:utf-8 -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc(): print ("myfunc() called.") ...
- 廖雪峰python教程笔记:装饰器
这是看廖老师python教程的第一个的笔记,因为这是这份教程最难的章节之一,我来来回回看了三遍,终于有所突破,写在这里是为了巩固自己的理解,同时也是希望有错的地方能够得到指正.具体内容见廖雪峰老师的课 ...
- Python学习之路-装饰器生成器正则表达式
装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(fu ...
- Python学习之路--装饰器
三元运算 变量 = 条件返回True的结果 if 条件 else 条件返回False ,用于简单 import time time.time() 1970年至今多少秒 time.sleep()暂时休眠 ...
最新文章
- 【Spark深入学习 -14】Spark应用经验与程序调优
- 用例子说明MVC 设计模式(以Objective-C 实现)
- checkboxlist 数据库连接代码
- SwipeRefreshLayout实现上拉加载
- python无法启动该程序因为计算机中丢失_python报错:无法启动此程序,因为计算机中丢失...
- vi格式化代码,撤销,重做,回退操作
- python_易忘的简单知识点总结
- python-元组数据类型-0222
- SpringBoot系列九:SpringBoot服务整合(整合邮件服务、定时调度、Actuator监控)
- Android移动应用基础教程【使用内容提供者共享数据】
- 优品景象 进销存系统推荐_初步了解WMS(仓库管理系统)
- 测试低频噪音软件,设计制作并验证0.1Hz~10Hz超低频微弱噪音检测放大器STEP BY STEP...
- 商业分析的50个网站和分析方法
- Android自定义View单TextView显示多种文字样式
- Azkaban Flow 2.0的使用
- JQuery中$(document)是什么意思?
- C#编写的AccessHelper
- pcb布局设计_PCB设计布局的重要提示
- 让AI简单且强大:深度学习引擎OneFlow技术实践
- 我的一点企业上云经验