Python装饰器

一、装饰器原则

  • 不能修改函数源代码
  • 不能改变函数的调用方式

二、装饰所用到的知识点

  1. 函数即变量
    • 函数定义可以同样理解为变量定义,函数名即为变量名;
    • 当将直接调用函数名时,函数并没有被执行,而是将函数体传递出去;
    • 当函数名加上”()”时,函数才真正被执行。
"""
举个例子,当函数名info赋予f后,相当于将info函数的内存地址告知f;
当f被执行时,执行的是info内存地址中函数体。
"""
def info()#定义一个输出函数
    print("123")
f=info # 将函数名赋给变量f
f() # 加上()后的f可以执行函数
'''
>>>123
'''
  1. 高阶函数:满足下列任意条件即为高阶函数
    • 返回值包含函数名
    • 将函数名作为实参
  2. 嵌套函数

三、装饰器函数

  1. 二层简单装饰器
    先来看一段程序
import  time
def timer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print("程序执行所用时间为%s"%(stop_time-start_time))
        return res
    return wrapper
@timer
def text(info):
    time.sleep(2)
    print(info)
    return info
a=text("你好,世界")
print("返回值:%s"%a)
'''
>>>你好,世界
>>>程序执行所用时间为2.004257917404175
>>>返回值:你好,世界
'''
程序解析
  1. 当text函数被施加了装饰器timer时,@timer相当于text=timer(text)
  2. text被装饰后,其函数体已经被装饰函数第一层以返回值的方式,替换成了二层函数wrapper
  3. 这时text已经不是原来的text函数,它已经被wrapper包装并替代了,text纯属山寨(可以通过函数名的地址查看)
  4. 如果想让text从山寨变成高仿(它已经不是从前的它了),可以在二层wrapper函数前加上@functools.wraps(func),把整个被装饰函数的其它属性复制下来。@functools.wraps(func)方法需要导入模块:import functools
  1. 装饰器工作流程图:
    装饰器工作流图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值