Python 函数装饰器和闭包

本文深入讲解了Python中的函数装饰器,包括装饰器的基本概念、如何实现简单装饰器、装饰带参数的函数,以及多层装饰的执行过程。此外,还介绍了如何通过闭包和自由变量实现可选装饰器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考博客: https://www.cnblogs.com/Lin-Yi/p/7306235.html

函数装饰器用于在源码中标记函数, 以某种方式增强函数的行为。 装饰器会在加载模块时直接运行。

装饰器是可调用的对象, 其参数是被装饰的函数。 但装饰器通常会把函数替换位另一个函数

实现一个简单的装饰器:

def decorate(func):
def inner():
print("我是装饰器")
     func()
return inner


@decorate
def func():
pass

func()
print(func)

我是装饰器
<function decorate.<locals>.inner at 0x000002B0C71D5378>

闭包是指延申了作用域的函数。

自由变量(free variable) 指未在本地作用域中绑定的变量 python中使用nonlocal来标记自由变量

如果被装饰的函数带参数:

def decorate(func):
    def inner(*args):
        print("开始装饰")
        func(*args)
        print("装饰结束")
    return inner


@decorate
def func(*args):
    print(*args)


func(1, 2)   # 由于装饰器会把被装饰的函数替换为另一个函数,这里是inner,所以在定义inner函数时接收参受

开始装饰
1 2
装饰结束

 如果目标函数需要多层装饰:

def decorate1(func):
    def inner(*args, **kwargs):
        print("装饰器1开始装饰")
        func(*args, **kwargs)
        print("装饰器1装饰结束")
    return inner


def decorate2(func):
    def inner(*args, **kwargs):
        print("装饰器2开始装饰")
        func(*args, **kwargs)
        print("装饰器2装饰结束")
    return inner 

@decorate1    # 相当于 func = decorate1(decorate2(func))  先执行decrate1() 函数  decorate1函数中的func执行也就是 decorate2(func)开始执行。 
@decorate2
def func(*args):
    print(*args)


func(1, 2)   

装饰器1开始装饰
装饰器2开始装饰
1 2
装饰器2装饰结束
装饰器1装饰结束

 可选择装饰器, 需要三层闭包嵌套:

def flagoperation(flag):
    def decorate(func):
        def inner(*args, **kwargs):
            print("装饰器开始装饰")
            func(*args, **kwargs)
            if flag == True:
                print("我是后置操作")
            print("装饰器装饰结束")
        return inner
    return decorate


@flagoperation(True)    # 相当于 decorate(func)  带着一个参数 True    带着True参数再对目标函数进行装饰
def func(*args):
    print(*args)


func(1, 2)

装饰器开始装饰
1 2
我是后置操作
装饰器装饰结束

  

转载于:https://www.cnblogs.com/frank-shen/p/10279823.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值