python笔记之装饰器

本文深入探讨了Python中的闭包和装饰器概念。闭包允许内部函数访问并可能修改外部函数的变量,保持外部函数栈帧不释放,常用于逻辑连续和内存管理。装饰器则提供了一种在不修改原有函数功能的基础上添加新功能的方式,通过拦截调用来实现。文中通过实例详细解释了闭包和装饰器的工作原理,并展示了它们在实际编程中的应用。
摘要由CSDN通过智能技术生成
Enclosing  外部嵌套作用域
    内部函数可以读取外部函数变量
    如果修改必须使用nonlocal声明
def func03():
    a = 10
    def func04():
        # a = 20 # 创建了func04的局部变量

        nonlocal a
        a = 20
        print("func04,",a) # 20
闭包
    三大要素:
        有外有内
        内访问外
        外返回内

    作用:
        外部函数栈帧执行过后不释放,
        供内部函数使用
def func01():
    a = 10

    def func02():
        print(a)

    return func02


# 调用外函数,返回内部函数
result = func01()  # 【外部函数栈帧没释放】
# 调用内部函数
result()  # 【可以访问外部函数变量】

闭包应用:

逻辑连续

创建的变量存储空间不会消失

def give_gife_money(money):  # 得钱
    print("获得", money, "元压岁钱")
    def child_buy(commodity, price): # 花钱
        nonlocal money
        money -= price
        print("购买了", commodity, "花了", price, "元,还剩下", money)
    return child_buy

# 调用外部函数
action = give_gife_money(500)
# 调用内部函数
action("变形金刚", 200) #还剩300
action("芭比娃娃", 300) #还剩0 
装饰器
    在不改变旧功能基础上,增加新功能
    核心逻辑:
        拦截调用
装饰器 - 语法细节
    内函数返回值:旧功能的返回值
def new_func(func):
    def wrapper(*args, **kwargs):  # 多合一
        print("新功能")
        result = func(*args, **kwargs)  # 一拆多
        return result

    return wrapper


@new_func
def func01(p1):
    print("旧功能1,参数:", p1)
    return 10


@new_func
def func02(p1, p2):
    print("旧功能2,参数:", p1, p2)
    return 20


# 调用内函数
print(func01(100))  # 10
print(func02(200, 300))  # 20
func02(p1=400, p2=500)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值