首先装饰器是非常常用的python 高阶方法。笔者带领大家依次去了解装饰器产生的目的
装饰器 的定义:装饰器本质上就是一个python函数,它可以让其它函数在不需要做任何代码改动的前提下增加额外的功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景中,比如-- >插入日志、性能测试、事务处理、缓存、权限校验等场景。
首先python的装饰器的功能可以不通过装饰器来完成
例如计算统计时间:
import time
def f1():
# print(time.time())###unix时间戳
print('This is a function')
#定义为格林位置时间的1970年01月01日00时00分00秒到现在的总秒数
##对修改是封闭枫的,对扩展是开放的
# f1()
def f2():
print('Thie is a function')
def print_current_time(func):
print(time.time())
func()
print_current_time(f1)
print_current_time(f2)
1641455890.6535068
This is a function
1641455890.6535068
Thie is a function
通过函数的调用来完成调用,是可以达到目的的
但是这样违背了我们python编程语言的初衷,我们在使用函数的时候,遵循定义可以麻烦,但是调用必需精简,
其次是,一个常规的思想,对修改是封闭的,但是对于扩展是开放的。
第一种,无参的装饰器:
def decorstor(func):
def wrapper():
print(time.time())
func()
return wrapper
@decorstor
def f1():
# print(time.time())###unix时间戳
print('This is a function')
1641456855.1922462
This is a function
第二种,二个或者多个参数的装饰器:
我们在使用装饰器时,为了满足不同函数的个性化需求,往往,参数不确定个数多少,为了更好的满足不同的需求,通常需要把装饰器抽象化
def decorstor(func):
def wrapper(*args,**kwargs):
print(time.time())
func(*args,**kwargs)
return wrapper
@decorstor
def f1(func_name):
# print(time.time())###unix时间戳
print('This is a function'+func_name)
@decorstor
def f2(func_name1,func_name2):
print('Thie is a function'+func_name1+func_name2)
@decorstor
def f3(func_name1,func_name2,**kw):
print('Thie is a function'+func_name1+func_name2)
print(kw)
f1('est')
f2("est",'acasd')
f3('test','test2',a =1 ,b =2,c =3)
1641457351.128553
This is a functionest
1641457351.128553
Thie is a functionestacasd
1641457351.128553
Thie is a functiontesttest2
{'a': 1, 'b': 2, 'c': 3}