• python之装饰器


    装饰器

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

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

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

      1.函数即"变量"

      2.高阶函数

      3.嵌套函数


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

    user_status = False
    def 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'这种类型的数据
    @login
    def lol(name):
        '''英雄联盟欢迎界面'''
        print("欢迎来到英雄联盟!",name)
    

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

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


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


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

    user_status = False
    def 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)
    

      

  • 相关阅读:
    jsp大文件(视频)上传问题
    python多版本的pip共存问题解决办法
    buntu系统安装rpm包的方法
    如何查看linux是32位还是64位
    python的if else
    python获取列表唯一值
    python列表转数组
    python文件操作write与writelines的区别
    python中字符串str的strip()方法
    ubuntu16.04安装cloudcompare及打开方法
  • 原文地址:https://www.cnblogs.com/swearBM/p/9562752.html
Copyright © 2020-2023  润新知