博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python之装饰器
阅读量:4614 次
发布时间:2019-06-09

本文共 2244 字,大约阅读时间需要 7 分钟。

装饰器

  装饰器:今天我们来了解一下装饰器是什么?装饰器是什么,从名字上来看,是一个起装饰作用的机器。那么在python中,我们的装饰器又是什么呢?在python中装饰器是用来修改我们原来函数中的各种功能的,那么它与直接修改代码之间有什么区别呢?

  这里我们来说说编程的一些禁忌:已经上线的代码尽量不能修改,且调用方式不能改变(个人解释。。。)。那么我们的装饰器就应运而生了,在python中,装饰器就是在不修改函数原代码,以及函数的调用方式的情况下,实现对函数的拓展。

  这里对于装饰器,我们要理解这几点:

  1.函数即"变量"

  2.高阶函数

  3.嵌套函数


  这里展示一个具体的装饰器实例

user_status = Falsedef login(func):    '''用户验证界面'''    def inner(*args,**kwargs):        _username = 'Marvelous'        _password = 'zxq64289050'        global user_status        if user_status == False:            username = input("账号:").strip()            password = input("密码:").strip()            if _username == username and _password == password:                print("验证成功!")                user_status = True#验证成功后执行原来的函数            else:                print("输入错误请重试")            if user_status:                func(*args,**kwargs)#验证成功之后在这里就执行lol()    return inner#进入第一层函数返回inner的内存地址#**kwargs  输入的是 'name' = 'Marvelous'这种类型的数据@logindef lol(name):    '''英雄联盟欢迎界面'''    print("欢迎来到英雄联盟!",name)

   这里@login是装饰器的用法,相当于 lol = login(lol)

  这里再加一张流程的分析图:

 


  在这里,我们装饰器主要运用了嵌套函数和高级函数的知识,我们通过最外层的函数实现了lol = login(lol)来返回内层函数的内存地址,这个时候我们已经实现了调用方式从login()到lol()的转变了,要实现实质性的转变,这时候我们返回的内层函数的内存地址就要起效果了。这时候我们的程序开始在内层函数中走,如果账号密码正确,我们就可以执行func(),又因为我们外层函数传入参数的时候func = lol了,所以这个时候执行的便是我们的lol()了。按照这个程序的内容,这个时候我们就可以登陆"英雄联盟"啦!


带参数的装饰器如果要实现带参数的装饰器,我们就可以继续在外层函数套一层函数来实现。性质与上面类似,具体代码如下:

user_status = Falsedef login(auth_type):    '''用户验证界面'''    def outer(func):        def inner(*args,**kwargs):            _username = 'Marvelous'            _password = 'zxq64289050'            global user_status            if user_status == False:                username = input("账号:").strip()                password = input("密码:").strip()                if _username == username and _password == password:                    print("验证成功!")                    user_status = True#验证成功后执行原来的函数                else:                    print("输入错误请重试")                if user_status:                    func(*args,**kwargs)#验证成功之后在这里就执行lol()        return inner#进入第一层函数返回inner的内存地址    return outer#**kwargs  输入的是 'name' = 'Marvelous'这种类型的数据@login('qq')def lol(name):    '''英雄联盟欢迎界面'''    print("欢迎来到英雄联盟!",name)

 

  

 

转载于:https://www.cnblogs.com/swearBM/p/9562752.html

你可能感兴趣的文章
Codeforces Round #478 (Div. 2) D Ghosts 会超时的判断两个之间关系,可以用map
查看>>
box-shadow
查看>>
select * 和select 1 以及 select count(*) 和select count(1)的区别
查看>>
进度条04
查看>>
Silverlight RadGridView的HeaderCellStyle样式
查看>>
IE兼容CSS3圆角border-radius的方法
查看>>
Elsevier期刊投稿状态
查看>>
Heartbeat+LVS构建高可用负载均衡集群
查看>>
多表查询
查看>>
springMVC_数据的处理过程
查看>>
ORM + Mysql配置
查看>>
18 python 初学(time、random 模块)
查看>>
那些年我们扔过的漂流瓶
查看>>
javascript:巧用eval函数组装表单输入项为json对象
查看>>
2.grep、awk、sed、cut处理文本
查看>>
为什么我们叫雪狼队
查看>>
wpf button变成圆角
查看>>
测试开发学习进阶教程 视频&PDF
查看>>
C#基础-连接Access与SQL Server
查看>>
autofac
查看>>