python装饰器的理解

装饰器

装饰器的作用:是在不改变函数功能的基础上添加某项功能。

  1. 不带参数的装饰器:
    简单的闭包函数,格式:装饰器嵌套wrapper()函数
def buy_online(func):
    def wrapper():
        print("线上生鲜到家买买买")
        func()
    return wrapper


@buy_online
def cooking():
    print("洗菜")
    print("宽油下锅")
    print("下菜落锅")
    print("加调味料")
    print("耐心翻炒")
    print("尝尝味道")
    print("装碟")
cooking()
  1. 带参数的装饰器:
    格式:传参装饰器嵌套处理参数的函数嵌套wrapper(*args,**kwargs)函数
def buy_online(mall):
    def which_mall_online(func):

        def wrapper(*args, **kwargs):
            print("'{}' 线上生鲜到家 买买买".format(mall))
            func(*args, **kwargs)

        return wrapper

    return which_mall_online

@buy_online('每日优鲜')
def cooking(*args, **kwargs):
    print("洗菜")
    print("宽油下锅")
    print("下菜落锅")
    print("加调味料")
    print("耐心翻炒")
    print("尝尝味道")
    print("装碟")
  1. 装饰器兼容是否传参
    在传参装饰器上面添加传参和不传参选项,在函数内部进行装饰器判断,其他写法与传参函数相同
ef buy_online(decorated_func=None, mall=None):
    if decorated_func and mall:
        raise Exception('被装饰器装饰的函数和装饰器的参数不会在同一处出现')

    def which_mall_online(func):

        def wrapper(*args, **kwargs):
            nonlocal mall
            if mall == None:
                mall = ''
            print("{} 线上生鲜到家 买买买".format(mall))
            func(*args, **kwargs)

        return wrapper
    if decorated_func:
        # 如果是传递了被装饰的函数,则直接返回最内层wrapper函数
        return which_mall_online(decorated_func)
    else:
        # 进入这里,说明是装饰器是有参数或使用默认参数的,返回外层函数
        return which_mall_online


@buy_online(mall='饿了么生鲜')
def cooking(*args, **kwargs):
    print("洗菜")
    print("宽油下锅")
    print("下菜落锅")
    print("加调味料")
    print("耐心翻炒")
    print("尝尝味道")
    print("装碟")


@buy_online()
def cooking_default_parameter(*args, **kwargs):
    print("洗菜")
    print("宽油下锅")
    print("下菜落锅")
    print("加调味料")
    print("耐心翻炒")
    print("尝尝味道")
    print("装碟")


@buy_online
def cooking_decorator_no_parameter(*args, **kwargs):
    print("洗菜")
    print("宽油下锅")
    print("下菜落锅")
    print("加调味料")
    print("耐心翻炒")
    print("尝尝味道")
    print("装碟")

# 执行正常
cooking()
cooking_default_parameter()
cooking_decorator_no_parameter()
  1. 多个装饰器的执行顺序
    多个装饰器时,定义时,从最靠近原函数的开始定义,执行时,从离原函数最远的开始执行。
@zero_stage
@kindergarten_stage
@primary_school_stage
@middle_school_stage
@high_school_stage
@university_stage
@social_stage
def peak_of_life():
    print("走向人生巅峰?")

# 执行结果,这是装饰函数里面的打印变量
进入social_stage函数定义
进入university_stage函数定义
进入 high_school_stage函数定义
进入 middle_school_stage函数定义
进入primary_school_stage函数定义
进入kindergarten_stage函数定义
进入zero_stage函数定义

# 输出结果:这是wrapper函数里面的打印内容
还是个受精卵
懵懵懂懂进入了幼稚园
每天佩戴红领巾的小学生
上晚自习的初中生
一个月只能回一次家的高中生
从此知道了二进制的CS大学生
社会大学,深不可测
走向人生巅峰?

参考链接:
https://zhuanlan.zhihu.com/p/66984666

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值