欢迎来到@一夜看尽长安花 博客,您的点赞和收藏是我持续发文的动力
对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:3329759426@qq.com 。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。
专栏:
文章概述:对装饰器函数的介绍
关键词:装饰器函数
本文目录:
Python装饰器
装饰器就是一种闭包,它可以使闭包的访问方式更简单。本质上,装饰器(decorator)就是一个返回函数的高阶函数。
在Python中使用装饰器,需要使用一个特殊的符号“@”来实现。在定义装饰器函数或类时,使用“@装饰器名称”的形式将符号“@”放在函数或类的定义行之前。
def f1(func):
def wrapper():
print('Started')
func()
print('Ended')
return wrapper
def f():
print('Hello')
//方法1
f1(f)()
//方法2
f=f1(f)
f()
两者等价
使用装饰器
def f1(func):
def wrapper():
print('Started')
func()
print('Ended')
return wrapper
@f1
def f():
print('Hello')
f()
实现更通用的装饰器函数
实际上,每次调用f函数的时候,会把f作为参数传给f1,然后再调用返回的闭包函数~
def f1(func):
def wrapper(*args, **kwargs):
print('Started')
func(*args, **kwargs)
print('Ended')
return wrapper
@f1
def f(a):
print(a)
f('Hi!')
@f1
def f(a, b=9):
print(a, b)
f('Hi!')
返回值
def f1(func):
def wrapper(*args, **kwargs):
print('Started')
val = func(*args, **kwargs)
print('Ended')
return val
return wrapper
@f1
def add(x,y):
return x+y
print(add(4,5))
比如测试算法耗用时间
import time
def timer(func):
def wrapper():
before = time.time()
func()
print('Function took:', time.time()-before, 'seconds')
return wrapper
@timer
def run():
time.sleep(2)
run()
比如自动记录日志
str(arg) for arg in args就是将每个数转换成字符串的形式
import datetime
def log(func):
def wrapper(*args, **kwargs):
with open("logs.txt", "a") as f:
f.write("Called function with "+ " ".join([str(arg) for arg in args])+" at "+str(datetime.datetime.now())+"\n")
val = func(*args, **kwargs)
return val
return wrapper
@log
def run(a, b, c=9):
print(a+b+c)
run(1,3,c=9)