python装饰器的使用

文章详细介绍了Python装饰器的概念,它是一种闭包函数,用于在不修改原函数代码的基础上增加额外功能。装饰器常用于用户登录、日志等功能。文中通过实例展示了如何使用装饰器,包括无参数和带参数的装饰器,并给出了登录检查的装饰器应用场景。

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

python装饰器的使用

python装饰器的概念

装饰器:本质上就是一个闭包函数(即定义了一个嵌套函数,内层函数调用外层函数的值,不包括全局变量只是在函数内部内调用)
装饰器作用:在不修改原有调用函数的基础上,给函数增加额外的功能
解释:即不修改原有函数代码,在函数执行前后增加新的功能
使用场景:用户登录,日志等

python装饰器的使用

通过下面例子来看一下,不使用@装饰器名

def guanji(game):
    def inner():
        print('start外挂')
        game()  # 此时这份参数就变成了lol()  那么此时执行的的时候就会到lol中执行lol定义的函数;
        print('end外挂')
    return inner  # 不能加括号,加括号表示将目标函数的执行的结果返回,不加表示返回内层函数,相当于返回inner()函数,需调用

def lol():
    print('"德玛西亚"--放技能')

dd = guanji(lol)
dd()

执行结果如下:
在这里插入图片描述

@装饰器名,

通过@装饰器名调用,随时用可以随时调。

def guanji(game):
    def inner():
        print('start外挂')
        game()  # 当调用loj()此时game()参数就变成了lol()  那么此时执行的的时候就会到lol中执行lol定义的函数;
        print('end外挂')
    return inner

@guanji   #等同于lol = guanji(lol),
def lol():
    print('"德玛西亚"--放技能')

lol()   # 调用

在这里插入图片描述

使用解析

"""
def wrapper(fn):  #wrapper:装饰器,fn:目标函数
    def inner():
        #目标函数执行前...
        res = fn() #调用的函数
        #目标函数执行后...
        return res
    return inner  #不能加括号,加括号表示将目标函数的执行的结果返回,
    #调用
    @wrapper
    def target():
    	pass
target()  #--->inner()

不加表示返回内层函数,相当于返回inner()函数,需调用
“”"

python装饰器-传递参数

"""
def guanjia(game):
    def inner(usr,pwd):
        print('start外挂')
        game(usr,pwd)
        print('end外挂')
    return inner

#lol=guanjia(lol),这是返回值为inner(),通过lol调用的时,给了参数,那么执行inner()如果没参数,那么就会报错,所以inner也需要设置
跟lol形式参数,game参数已经用lol()代替,lol中有参数,那么game()没有,也会报错缺失参数,所以也需要定义要调用函数的形式参数,
总之呢,lol()是要装饰的函数,那么lol()有的参数就需要在inner()及game()定义


@guanjia
def lol(usr,pwd):
    print('使用的账号是{},密码是{}'.format(usr,pwd))
    print('德玛西亚-放大招')
    
@guanjia
def cf(usr,pwd,zhuangbei):
    print('使用的账号是{},密码是{},使用装备'.format(usr,pwd,zhuangbei))
    print('cf进攻开始')
    
lol('admin','123456')
    
cf('admin','123456','手枪')  
#这时调用cf肯定能会报错,因为inner()跟game()只有两个参数,这时候我们为了代码可以更加重复的使用,就要做些修改,
"""

调用lol()结果
在这里插入图片描述
调用cf(‘admin’,‘123456’,‘手枪’)
在这里插入图片描述

python装饰器 传递参数2

针对实现cf(‘admin’,‘123456’,‘手枪’) 甚至更多参数的情况,我们将参数修改为*args,**kwargs

def guanjia(game):
    def inner(*args, **kwargs):  #*,**表示将接收的所有参数,分别打包成元组跟字典
        print('start外挂')
        game(*args, **kwargs)  ##*,**表示将接收的args元组,kwargs字典,打散成位置参数跟关键字参数传递进去
        print('end外挂')

    return inner

@guanjia
def lol(usr, pwd):
    print('使用的账号是{},密码是{}'.format(usr, pwd))
    print('德玛西亚-放大招')

@guanjia
def cf(usr, pwd, zhuangbei):
    print('使用的账号是{},密码是{},使用装备是{}'.format(usr, pwd, zhuangbei))
    print('cf进攻开始')

cf('admin', '123456', '手枪')

调用cf(‘admin’, ‘123456’, ‘手枪’)结果如下
在这里插入图片描述

多个装饰器调用一个函数

这个有空大家可以研究一下。

python 装饰器实战

编写一个需要登录后才能完成查询,修改操作功能

ogin_status = False
def login():
    global login_status
    if login_status == False:
        while True:
            usr = input('>>>输入账号:')
            pwd = input('>>>输入密码:')
            if usr=='admin' and pwd=='123456':
                print('登录成功')
                login_status = True
                break
            else:
                print('登录失败,重新输入账号密码')

def wrapper(fn):
    def inner():
        login()
        res = fn()
        return res
    return inner

@wrapper
def select():
    print('查询列表')

@wrapper
def upset():
    print('修改列表')
 
select()
upset()

执行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值