【python 装饰器】一文带你搞懂装饰器

在讲装饰器前先简短带大家回顾一下闭包的概念。

闭包

满足以下三个条件:

  1. 闭包函数 定义在函数内部
  2. 使用了外部函数的变量
  3. 外部函数返回了该内部函数

下面这段代码中,prompt就是一个闭包函数。

# 代码1
def eat():
    food = "香蕉"
    def prompt():
        print(food)
    return prompt

eat()

装饰器

装饰器的作用:在不修改原函数代码的基础上为原函数增加新功能。

执行流程:

1. 装饰器接收一个函数,并存着

2. 装饰器返回一个闭包函数

3. 闭包函数被调用,执行其对应的代码。

一个装饰器修饰函数

"""定义一个装饰器,用于输出提示信息"""


def prompt(func):
    def inner():
        print("加法运算:")
        func()
    return inner

@prompt
def add(a=1, b=2):
    print(a + b)

add()
# 输出
加法运算:
3

上面这段程序执行过程:

  1. 当Python解释器读到@prompt装饰器时,它会立即执行prompt函数,并将add函数作为参数传递给它。
  2. prompt函数定义了inner函数,并将其作为闭包返回。
  3. 装饰器@prompt的作用完成后,add的名字不再指向原始的add函数,而是指向了prompt返回的inner函数。
  4. 最后,当代码执行到add()时,实际上是在调用inner函数。
  5. inner函数中,它会首先打印出"加法运算:",然后调用原始的add函数。

多个装饰器修饰函数

注意:装饰器是靠近函数定义的装饰器开始向上执行(即从下往上执行)

def action(func):
    print('action', func)
    def out1(actions='狗刨'):
        func()    # 这里调用的是out函数
        print('游泳动作: %s' % actions)
    return out1


def eat(func):
    print('eat', func)
    def out(food='香蕉'):
        func()    # 这里调用的是animal函数
        print('吃: %s' % food)
    return out

@action
@eat
def animal(animals='猴子'):
    print(animals)

animal()    # 这里调用的是迭代器action返回的out1()
# 输出
eat <function animal at 0x000001CBEFFE5800>
action <function eat.<locals>.out at 0x000001CBEFFE58A0>
猴子
吃: 香蕉
游泳动作: 狗刨

程序执行过程:

  • 因为是从下往上执行,所以先执行@eat,在执行@action。
  • Python执行到@eat装饰器时,eat装饰器被调用,其参数是animal函数。
  • 接下来,@action装饰器被调用,其参数是eat装饰器返回的out函数。
  • 最终,animal函数变替换成out1函数,然后在animal()这行开始调用。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值