装饰器入门(总结) -4


'''
装饰器作用:<用来装饰其他函数的,即为其他函数添加特定功能的函数>

装饰器函数的两个基本原则:
1.装饰器不能修改被装饰函数的源码
2.装饰器不能修改被装饰困数的调用方式
关于第二点的说明:
@timer 等效于foo=timer(foo),事实上返回的是嵌套函数的view(引用):timer_calc
但接受的名称记为foo,就是符合第二点,不能改变被装饰函数的调用方式

3.如果不用语法糖@timer,调用方式如下:
foo=timer(foo) --> @timer
foo()
'''

'''
装饰器基本步骤:
1.定义一个接受函数名作为参数的高阶函数
2.在高阶函数中定义一个嵌套函数,在该嵌套函数中封装想要添加的功能代码
3.调用作为参数传入的函数名
4.返回嵌套函数的函数名
'''


# (1)被装饰函数带有参数或不带参数
def deco(func):
    def inner(*args,**kwargs):
        # 包含所有的附加功能
        func(*args,**kwargs)
    return inner
'''
eg.
0. 装饰器就是在运行被装饰函数的基础添加<特定的功能>
1. foo("MMiL",18) -> 等效于调用嵌套函数timer_calc("MMiL",18) <- foo=timeer(foo)
    在嵌套函数里面调用被装饰的函数func(name,age)
2. 为了增加通用性,不同的被装饰函数输入参数都不一样,考虑到自适应性
    装饰器嵌套函数应该*args,**kwargs
'''

# (2)装饰器本身带参数
def deco(param): # param是装饰器本身的参数
    def outer(func): # 是已被装饰的函数名作为参数 -> 语法糖
        def inner(*args,**kwargs):
            # 包含所有的附加功能
            func(*args,**kwargs)
        return inner
    return outer
'''
eg.
1. @timer(timer_type="timer_by_minute") 等效于:foo=timer(timer_type="timer_by_minute")(foo);
   链式传参; timer(timer_type="timer_by_minute")返回的是outer函数引用,在传入outer(foo)-->返回嵌套函数inner引用-->foo
2. 深刻理解return outer,return inner, 返回嵌套函数引用 & 嵌套函数里面的链式调用
'''

# (3)被装饰函数带返回值
def deco(param): # param是装饰器本身的参数
    def outer(func): # 是已被装饰的函数名作为参数 -> 语法糖
        def inner(*args,**kwargs):
            # 包含所有的附加功能
            result=func(*args,**kwargs) # 接收到被修饰函数的返回值
            return result # 返回被修饰函数的返回值
        return inner
    return outer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Liooo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值