装饰器

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)

以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象学习之八,装饰器

thymeleaf 片段渲染后重新加载 javascript

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码