python3——闭包与装饰器学习笔记

目录

一、闭包

二、装饰器

三、装饰器的应用(案例)


一、闭包

1. 闭包的条件
(1)外部函数中定义了内部函数
(2)外部函数是有返回值的
(3)返回值是内部函数名(注意后面不加括号,加括号后变成了内部函数调用)
(4)内部函数引用外部函数的变量
2.格式
    def 外部函数():
        ...
        def 内部函数():
            ...
        return 内部函数
3.闭包的缺点
(1)作用域没有那么直观
(2)因为变量不会被垃圾回收,所以会存在一定的内存占用问题
4.闭包的作用
(1)可以使用同级作用域
(2)读取其他元素的内部变量
(3)延长作用域
5.总结
(1)闭包优化了变量,原来需要类对象完成的工作,闭包也能完成
(2)由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
(3)闭包可以使代码简洁,便于阅读代码
(4)闭包是理解装饰器的基础

二、装饰器

1.装饰器是建立在闭包的基础之上的,需要满足如下条件:
(1)外部函数的形参为函数名
(2)内部函数调用外部函数得到的函数
(3)被装饰的函数需要加上 @装饰函数名 ,装饰函数名后可以带上参数,也可以不加参数
2.被装饰函数上方加上@装饰函数名的意义
(1)调用装饰函数的外部函数
(2)将装饰函数名作为参数传递给外部函数
(3)将内部函数名(地址)赋给被装饰函数名
(4)重新手动调用被装饰函数相当于调用的是内部函数
3.多层装饰器
一个被装饰函数可以使用多个装饰函数,但是优先使用离被装饰函数最近的装饰函数
4.带参数的装饰器
带参数的装饰器是三层的,最外层函数负责接收装饰器参数,里面的内容还是原装饰器的内容

三、装饰器的应用(案例)

案例:实现支付的登录与验证

实现思路:

支付功能,支付前检验用户是否登录,未登录则直接提醒用户登录,已登录则进行支付,其中检验用户是否登录就可以使用装饰器,用来装饰支付功能函数

实现代码:

"""
案例:实现支付的登录与验证

实现思路:
支付功能,支付前检验用户是否登录,未登录则直接提醒用户登录,
已登录则进行支付,其中检验用户是否登录就可以使用装饰器,用来装饰支付功能函数
"""
login_flag = False # 用户登录状态,默认未登录

# 登录功能
def login():
    account = input('请输入账号:')
    password = input('请输入密码:')
    if account == 'admin' and password == '123456':
        print('登录成功!')
        return True
    else:
        print('登录失败!')
        return False

# 装饰函数,检验用户是否登录
def is_login(fun):
    def inner(*args):
        global login_flag
        if login_flag: # 用户已登录
            fun(*args)
        else:
            print('未登录,请先登录再支付!')
            while True:
                login_flag = login() # 用户未登录,提示用户登录
                if login_flag: # 判断是否登录成功
                    fun(*args)
                    break
    return inner

@is_login
# 支付功能
def pay(money):
    print('-----------------支付-----------------')
    print('支付金额为:{},已支付成功!'.format(money))

pay(800) # 支付800

pay(1000) # 支付1000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值