装饰器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。
装饰器原则:1.不修改被修饰函数的源代码
2.不修改被修饰函数的调用方式
装饰器的知识储备
装饰器=高阶函数+函数嵌套+闭包
高阶函数:
函数接收的参数是一个函数
函数的返回值是一个函数
满足上述条件任意一个,都可以称为高阶函数
函数嵌套
def father(name):
print(‘form father %s‘%name)
def son():
print(‘form the son‘)
print(locals())
father(‘wild_ghosts‘)
闭包
内部函数的代码包含对外部作用域的引用
1.装饰器架子
import time
def timemer(func):
def wrapper():
startTime=time.time()
func()# 就是在运行test
endTime=time.time()
print(‘函数运行时间是%s‘%(endTime-startTime))
return wrapper
@timemer # -->test=timemer(test)
def test():
time.sleep(3)
print(‘test函数调用完毕‘)
test=timemer(test)# 实际上返回的是wrapper的地址
test()# 实际上调用test函数就是在调用wrapper函数
2.为装饰器加上返回值
2.为装饰器加上返回值
import time
def timemer(func):
def wrapper():
startTime=time.time()
res=func()# 就是在运行test
endTime=time.time()
print(‘函数运行时间是%s‘%(endTime-startTime))
return res
return wrapper
@timemer # -->test=timemer(test)
def test():
time.sleep(3)
print(‘test函数运行完毕‘)
return ‘返回值‘
res=test() # 就是在运行wrapper,返回值是wrapper的返回值,要想返回test的返回值,需要在wrapper函数用一个变量接受test的返回值
print(res)
3.为装饰器加上参数
import time
def timemer(func):
def wrapper(*args,**kargs):#*args可以接受不定长参数,**kargs可以接受关键字传值
startTime=time.time()
res=func(*args,**kargs)# 就是在运行test
endTime=time.time()
print(‘函数运行时间是%s‘%(endTime-startTime))
return res
return wrapper
@timemer # -->test=timemer(test)
def test(name,age):
time.sleep(3)
print(‘test函数运行完毕‘)
print(‘name=%s,age=%s‘%(name,age))
return ‘test:返回值‘
@timemer
def test1(name,age,gender):
time.sleep(3)
print(‘test1函数运行完毕‘)
print(‘name=%s,age=%s,gender=%s‘%(name,age,gender))
return ‘test1:返回值‘
res=test(‘alex‘,18) # 就是在运行wrapper
print(res)
res=test1(‘alex‘,18,‘小垃圾‘)
print(res)
以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章