zoukankan      html  css  js  c++  java
  • day4 装饰器深入解析

    Python装饰器

        装饰器是在不修改源码给代码添加功能的常用方法。@是装饰的标志。我们知道,在给代码增加功能的时候,要遵循开放封闭的原则,不能随便更改原码,因此装饰器的功能就显示出来了,只需要在函数前面加上装饰器就能解决问题所需。

    def verification(func):
        #验证模块
        def inner():
            print("请输入你的账号和密码进行验证")
            func()
        return inner
    
    def f1():
        print(666)
    
    def f2():
        print(777)
    
    def f3():
        print(888)
    
    def f4():
        print(999)
    
    f2 = verification(f2)
    print(f2)
    f2()

        上面代码中,我们给f2增加了一个验证功能,很多时候,我们需要在不改变原码的情况下对程序的功能进行扩展。上面是装饰器的原理。装饰器相当于在函数上面添加了一句代码f = func(f),让程序在执行的时候能够先进行验证,下面来看一下完整的装饰器。

    def verification(func):
        #验证模块
        def inner():
            print("请输入你的账号和密码进行验证")
            func()
        return inner  
    
    def f1():
        print(666)
    
    def f2():
        print(777)
    
    def f3():
        print(888)
    
    def f4():
        print(999)
    
    f1 = verification(f1)
    f2 = verification(f2)
    f3 = verification(f3)
    f4 = verification(f4)
    
    f2()        #此处f2即inner的函数地址,执行f2()其实执行的是inner()

        上述代码中,我们增加了四局代码,使我们能够在不修改原码的情况下,对程序进行了扩充,并且没有改变其他部门使用人的习惯,很好的解决了问题,这种方法其实就是装饰器的原理。我们进行简单的修改就能够更加好看和美观。

    
    
    def verification(func):
    #验证模块
    def inner():
    print("请输入你的账号和密码进行验证")
    func()
    return inner

    @verification #f1 = verification(f1)
    def f1():
    print(666)

    @verification #等价于f2 = verification(f2)
    def f2():
    print(777)

    @verification #f3 = verification(f3)
    def f3():
    print(888)

    @verification #f4 = verification(f4)
    def f4():
    print(999)

    f2() #此处f2inner的函数地址,执行f2()其实执行的是inner()
     

        上面代码中,我们应用了装饰器@,也实现了与上面代码一样的功能,其实函数f1上面的装饰器@verification等价于f1 = verification(f1)这句话,让我们在进行函数之前,首先执行验证代码块,由于verification(f1)是执行验证函数,此时用户还没有调用,但是函数已经执行,为了不让函数执行验证模块,我们增加了一层函数嵌套,在第二层进行嵌套,第一层的作用是返回第二层嵌套函数的函数名,以便在用户输入调用的时候在进行调用,所以用户在调用的时候,输入f2()其实等于执行了函数inner()。此时inner()函数也激活了,在python内存中存在。

        因此,如果我们不想某层函数执行的话,就给函数嵌套一层函数,返回第一层函数的函数名,在第二层进行执行。我们也可以给函数增加参数,要知道是那个函数在执行命令。

        给函数传递参数,给函数传递一个参数,由于我们知道,用户调用f2()的时候,其实运行的是inner(),因此inner()的参数与func()一样多。下面我们来给装饰器传递一个参数。

    def verification(func):
        #验证模块
        def inner(name):
            print("请输入你的账号和密码进行验证")
            func(name)
        return inner
    
    @verification      #f1 = verification(f1)
    def f1(name):
        print(666)
    
    @verification      #等价于f2 = verification(f2)
    def f2(name):
        print(777,name)
    
    @verification       #f3 = verification(f3)
    def f3(name):
        print(888)
    
    @verification       #f4 = verification(f4)
    def f4():
        print(999)
    
    f2("alex")        #此处f2即inner的函数地址,执行f2()其实执行的是inner()

        传递多组参数:

    def verification(func):
    #验证模块
    def inner(*args,**kwargs):
    print("请输入你的账号和密码进行验证")
    func(*args,**kwargs)
    return inner

    @verification #f1 = verification(f1)
    def f1(name):
    print(666)

    @verification #等价于f2 = verification(f2)
    def f2(name):
    print(777,name)

    @verification #f3 = verification(f3)
    def f3(name,age,*args):
    print(888,name,age,args)

    @verification #f4 = verification(f4)
    def f4():
    print(999)

    f2("alex") #此处f2inner的函数地址,执行f2()其实执行的是inner()
    f3("alex","sb","is",333,222)

        我们结合之前学习的动态参数*args,**kwargs可以给函数传递多个参数,这样能满足用户传入多个参数不会出错的情况。

        上面代码运行结果如下:

        请输入你的账号和密码进行验证
      777 alex
      请输入你的账号和密码进行验证
      888 alex sb ('is', 333, 222)
        我们给f3()传递了多个参数,但是系统并没有报错,而且正常接受了参数,可见使用*args,**kwargs能够接收多个参数,并且不同的函数即便函数的参数的个数不一致也没有关系。

        装饰器就是为了给已经存在的函数扩展新的功能。

  • 相关阅读:
    web漏洞之SQL注入
    web漏洞之文件包含
    web漏洞之文件上传
    CVE-2020-1938 Apache-Tomcat-Ajp漏洞复现
    web漏洞之命令执行
    web漏洞之XXE
    web漏洞之CORS
    web漏洞之SSRF
    web漏洞之CSRF
    web漏洞之XSS
  • 原文地址:https://www.cnblogs.com/gengcx/p/6881594.html
Copyright © 2011-2022 走看看