Python之@函数装饰器的用法

1、解释

Python 装饰允许在不修改原有函数代码的基础上,动态地增加或修改函数的功能, 装饰器本质上是一个接收函数作为输入并返回一个新的包装过后的函数的对象。

所谓函数装饰器,就是在不修改原函数的前提下,来对函数的功能进行合理的扩充。

2、例子

import time


def log(func):
    print('1进入log')

    def wrapper(*args, **kw):
        print('3进入wrapper')
        print('call %s()' % func.__name__)
        print('4退出wrapper')
        return func(*args, **kw)

    print('2退出log')
    return wrapper


@log
def loga():
    print('5进入loga ')
    time.sleep(1)
    print('6退出loga')


def a():
    print('5进入a')
    time.sleep(1)
    print('6退出a')


# 把@log放到loga()函数的定义前面,相当于执行了语句:
# loga = log(loga)
loga()
print('x' * 20)
log_a = log(a)  # 先执行赋值
log_a()  # 先运行函数

3、运行结果

1进入log
2退出log
3进入wrapper
call loga()
4退出wrapper
5进入loga 
6退出loga
xxxxxxxxxxxxxxxxxxxx
1进入log
2退出log
3进入wrapper
call a()
4退出wrapper
5进入a
6退出a

4、分析

loga()函数在定义时使用了函数装饰器,a()函数在定义时未使用函数装饰器

loga()在执行时,首先执行的是装饰器函数log(),且在装饰器函数log()执行过程中函数内定义的wrapper()函数被跳过了【wrapper()函数只是在log里面定义了,没有被调用——没有加括号】,在log()函数执行后被返回给了loga;其次,在执行loga()函数,需要注意的是loga已经被重新赋值为wrapper()函数,所以此时实际上执行的是wrapper()函数

5、参考

 装饰器 - 廖雪峰的官方网站 (liaoxuefeng.com)

【Python】一文弄懂python装饰器(附源码例子)_python 装饰器-CSDN博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值