装饰器的应用

本文深入探讨了Python装饰器的概念,展示了其在功能增强、登录验证等场景的应用,并通过实例解释了多层装饰器和装饰器带参数的用法。同时,文中还涉及了函数作用域、闭包等相关概念,帮助读者更好地理解和运用装饰器。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、装饰器的定义

'''
装饰器
加入购物车,付款,修改收货地址. 
判断用户的登录状态,
'''
def func(number):
    a=100
    def inner_func():
        nonlocal  a
        nonlocal number
        number+=1
        for i in range(number):
            a+=1
        print('修改后的a',a)
    return inner_func
#调用func
f=func(6)
f()

#函数作为参数
a  = 50
f1=func(a)  #实参a是一个实参
print(f1)

#地址引用
a=10  #声明整型变量
b=a
def test(): #声明函数
    print('------test------')

t=test

#test()
#t()
def func(f):
    print(f) #<function test at 0x031DD978>
    f()
    print('--------->func')
#调用
func(test)

在这里插入图片描述

二、装饰器的使用

#登录校验
import time
def decorate(func):
    def warpper(*args,**kwargs): #()
        print('正在校验中....')
        time.sleep(2)
        print('校验完毕')
        #调用原函数
        func(*args,**kwargs)
    return warpper
@decorate
def f1(n):
    print('-------f1-------',n)
f1(5)
@decorate
def f2(name,age):
    print('-------f2-------',name,age) #() {'clazz':'1904'}
f2('lily',12)
@decorate
def f3(students,classs='1905'):
    print('{}班级的学生如下:'.format(classs))
    for stu in students:
        print(stu)
students=['lily','tom','aq']
f3(students,classs='1904')

三. 多层装饰器

在这里插入图片描述

'''
如果装饰器是多层的,谁距离函数最近就优先使用哪个装饰器
'''


#装饰器
def zhuang1(func):
    print('---------->1 start')
    def wrapper(*args,**kwargs):
        func()
        print('刷漆')
    print('-------->2 end')
    return wrapper
def zhuang2(func):
    print('---------->1 start')
    def wrapper(*args,**kwargs):
        func()
        print('搬砖,装门窗')
    print('-------->2 end')
    return wrapper
@zhuang2
@zhuang1
def house():
    print('我是毛坯房.....')
house()

在这里插入图片描述

四 装饰器带参数

#装饰器带参数
'''
带参数的装饰器是三层的
最外层的函数负责接收装饰器参数
Kim的内容还是原装饰器的内容
'''

def outer(a):  #第一层 ,负责接收装饰器的参数
    def decorate(func): #第二层,负责接收函数的
        def wrapper(*args,**kwargs): #第三层 负责接收函数的参数
            func(*args)
            print('------>铺地砖{}.'.format(a))
        return  wrapper  #返出来的是,第三层
    return decorate #返出来的是,第三层

@outer(a=10)
def house(time):
    print('我{}日期拿到房子,是毛坯房'.format(time))
house('2021-10-13')


@outer(100)
def street():
    print('新修街道的名字是,黑泉路')

street()

六,案例 登录验证脚本

在这里插入图片描述

v#开发,登录验证
import time
islogin=False #默认是没有登录的
#定义一个登录函数
def login():
    username=input('输入用户名')
    password=input('输入密码.')
    if username=='admin' and password=='123456':
        return True
    else:
        return  False

#定义一个装饰器,进行付款验证
def login_required(func):
    def wrapper(*args,**kwargs):
        global islogin
        #验证用户是否登录
        if islogin:
            func(*args,**kwargs)
        else:
            # 跳转到登录页面
            print('用户没有登录,不能付款')
            islogin=login()
            print('result',islogin)

    return wrapper

@login_required
def pay(money):
    print('正在付款,付款金额是:{}元'.format(money))
    print('付款中.....')
    time.sleep(2)
    print('付款完成!')


#调用
pay(10000)

pay(8000)

总结

a=100
def func():
    a=10
    def inner_func():
        a=1
        print(a)
    #inner_func()
    return  inner_func

#调用外部函数
f=func()

f()
def zhuang(func):
    def wrapper(*args,**kwargs):
        func()
        print('-------')
    return wrapper

@zhuang
def f1 ():
    pass
函数:
作用域:LEGB
L:local 本地 局部变量
E: encloseing 嵌套
G: Global 全局
B:built-in 内置的

嵌套函数:
闭包:
1.内层函数
2.内层函数引用外层函数的变量
3.返回内层函数

装饰器:
1.内层函数
2.内层函数引用外层函数的变量
3.返出内层函数
4.函数作为外层函数参数

使用装饰器
@装饰器的名字
def 函数名():
    pass
装饰器是Python中一种强大的功能,允许在不修改原始函数的情况下,向函数添加额外的功能。装饰器使用@符号将其应用于函数。 一个装饰器函数通常具有以下形式: ```python def decorator(func): def wrapper(*args, **kwargs): # 添加额外的功能 return func(*args, **kwargs) return wrapper ``` 其中,`decorator`是装饰器函数本身,`wrapper`是内部函数,用于包装原始函数,并添加额外的功能。 装饰器可以应用于函数,类甚至是类的方法。通过在被装饰的函数或方法前使用装饰器函数,可以将装饰器应用于该函数或方法。 例如,引用中的代码展示了一个简单的装饰器模板,引用中的代码展示了一个使用装饰器实现函数计时器的例子。在这个例子中,`timec`是装饰器函数,`wrapper`是内部函数用于计算函数执行的时间。被`timec`装饰的函数`con_add`和`join_add`会在执行前后输出运行时间。 引用中的代码展示了一个包含关键字的装饰器的例子。在这个例子中,`decorator`是装饰器函数,`wrapper`是内部函数用于在执行被装饰的函数前后输出时间。被`decorator`装饰的函数`f`接受两个位置参数和任意个关键字参数,并在执行前后输出相应的信息。 总之,装饰器是Python中一种强大的功能,可以用于给函数或方法添加额外的功能,而不需要修改原始函数的代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python装饰器的使用](https://blog.csdn.net/belong_to_you/article/details/111003741)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python之装饰器的使用](https://blog.csdn.net/qq_43830639/article/details/95247941)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值