了解一下什么是装饰器?
装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是增加其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。
首先我们来看一下 Python 中的嵌套函数:
def func1(): #定义函数func1
print(‘now you are inside the hi()‘)
def greet(): #在函数中嵌套一个函数greet
return ‘now you are in the gree()‘ #return返回一组字符串
def welcome():
return ‘now you are in the welcome()‘
print(greet()) #打印greet
print(welcome()) #打印greet
func1() #调用func1函数
如果在程序中打印greet以及welcome时不加括号,程序输出的会是greet以及welcome函数的内存地址
那现在我们知道了可以在函数中定义另外的函数。也就是说:我们可以创建嵌套的函数。现在你需要再多学一点,就是函数也能返回函数。
接着再尝试从函数中返回函数:
def func1(name): #定义一个func1函数并且传入一个参数name
def greet(): #定义greet函数
return "now you are in the greet() function" #return返回一组字符串
def welcome():
return "now you are in the welcome() function"
if name == "snake": #if判断,如果值对即返回greet
return greet
else: #否则返回welcome
return welcome
a = func1(name=‘snake‘) #实例化对象,并且给传入的参数赋一个值
print(a)
# outputs: <function greet at 0x7f2143c01500>
# 上面清晰地展示了`a`现在指向到func1()函数中的greet()函数
print(a())
# outputs: now you are in the greet() function
解释器的使用
import time #导入一个time模块
def timer(func): #装饰函数
def inner(): #闭包函数
start=time.time()
func() #函数调用
print(time.time()-start)
return inner #返回inner 切记不能加括号,否则就成了调用函数
def func1(): #被装饰函数
print(‘in func1‘)
time.sleep(2) #等待两秒后继续
func1=timer(func1) #地址的一个改变
func1() #本质上调用的是inner
其实这样使用是比较麻烦的,接下来会使用一个python解释器自带的装饰函数
现在我们使用@(python 解释器的装饰函数),试一下
import time #导入time模块
def timer(func): #装饰函数
def inner(): #闭包函数
start=time.time() #定义一个变量start来获取程序开始执行的时间
func() #调用func
print(time.time()-start) #输出程序执行完成使用的时间
return inner #返回inner 切记不能加括号,否则就成了调用函数
@timer #python解释器的装饰函数(@加上需要装饰函数的名称)
def func1(): #被装饰函数
print(‘in func1‘)
time.sleep(2) #程序等待两秒执行
#func1=timer(func1) #地址的一个改变
func1() #本质上调用的是inner
装饰器实际上是个python函数,实现是由闭包支撑的
应用场景:
1,引入日志
2,函数执行时间统计
3,执行函数前预备处理
4,执行函数后清理功能
5,权限校验等场景
6,缓存
7,事务处理
好了!今天的介绍的python装饰器到此就结束!
原文:https://www.cnblogs.com/tisnk/p/11605864.html