zoukankan      html  css  js  c++  java
  • 第二十九节,装饰器

    装饰器简介

    装饰器,用于装饰某个函数,或者方法,或者类
    装饰可以用于某个函数或者方法或者类在执行之前或者执行后做某些操作,也可以理解为,为某个函数或者方法或者类添加功能
    好处:是不用改变原来的函数,就可以给原来的函数添加功能
    方法:
    1,定义一个函数,里面传一个值用于接收被装饰函数的名称(叫做装饰器函数)
    2,在装饰器函数里定义一个函数(叫做装饰器功能函数)来写添加功能和执行被装饰函数
    3,在装饰器功能函数return返回被装饰函数给装饰器功能函数,并且在装饰器函数return返回装饰器功能函数给装饰器函数

    4,在被装饰函数上面写上 @装饰器函数名 就可以调用执行装饰器函数

    重点:只要函数应用上了装饰器,那么函数就会被重新定义,重新定义为装饰器的内层函数,装饰器内层函数的返回结果就等于应用了装饰器的函数结果

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    #装饰器函数
    def zh(sh): #接收被装饰函数的名称
        def zhshi():    #装饰器功能函数
            print("在执行被装饰函数前添加功能")
            r =  sh()   # 执行装饰器函数接收到的被装饰函数,也就是执行被装饰函数
            print("在执行被装饰函数后添加功能")
            return r    #将被装饰函数执行的结果返回给装饰器功能函数
        return zhshi    #将装饰器功能函数名称返回给装饰器函数
    
    @zh     # @zh 的意思是执行装饰器函数,并且将被装饰的函数名,当做参数传给装饰器函数,并且将装饰器函数的返回值重新赋值给被装饰的函数
    #被装饰函数
    def f1():
        print("f1被装饰函数功能")
    
    #执行f1函数
    f1()
    # 在执行被装饰函数前添加功能
    # f1被装饰函数功能
    # 在执行被装饰函数后添加功能

    重点:只要函数应用上了装饰器,那么函数就会被重新定义,重新定义为装饰器的内层函数,装饰器内层函数的返回结果就等于应用了装饰器的函数结果

    装饰器装饰含两个参数的函数,就是原始的函数有两个形式参数

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    #装饰器函数
    def zh(sh):     #定义装饰器函数,接收被装饰函数的名称
        def zhshi(a1,a2):   #定义装饰器功能函数,接收被装饰函数的形式参数,注意这里的形式参数可以不给被装饰函数的形式参数一样,但个数要一样
            print("在执行被装饰函数前添加功能")
            r =  sh(a1,a2)  #接收被装饰函数的形式参数并且执行被装饰函数
            print("在执行被装饰函数后添加功能")
            return r    #将被装饰函数返回结果给,装饰器功能函数
        return zhshi    #将装饰器功能函数名称返回给,装饰器函数
    
    @zh     #调用执行装饰器
    #被装饰函数
    def f1(a1,a2):
        a3 = a1 + a2
        return a3
    
    #执行f1函数
    s1 = f1(3,5)
    print(s1)
    # 最后打印结果
    # 在执行被装饰函数前添加功能
    # 在执行被装饰函数后添加功能
    # 8

    重点:只要函数应用上了装饰器,那么函数就会被重新定义,重新定义为装饰器的内层函数,装饰器内层函数的返回结果就等于应用了装饰器的函数结果

    装饰器装饰含N个参数和任意参数的函数(推荐)

    用(动态参数)一个*元组类型非约束参数名称 *args 和(动态参数)两个**字典类型非约束参数名称 **kwargs ,来实现装饰器装饰任意参数的函数(详情见自定义函数动态参数)

    动态参数)一个*元组类型*args:可以接受多个单一性的实际参数
    动态参数)两个**字典类型非约束参数名称**kwargs:可以接受多个键值性参数
    以上结合就可以接受任意参数

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    #装饰器函数
    def zh(sh):     #定义装饰器函数,接收被装饰函数的名称
        def zhshi(*args,**kwargs):   #定义装饰器功能函数,用*args,**kwargs动态参数,接收被装饰函数的形式参数
            print("在执行被装饰函数前添加功能")
            r =  sh(*args,**kwargs)  #用*args,**kwargs动态参数,接收被装饰函数的形式参数并且执行被装饰函数
            print("在执行被装饰函数后添加功能")
            return r    #将被装饰函数返回结果给,装饰器功能函数
        return zhshi    #将装饰器功能函数名称返回给,装饰器函数
    
    @zh     #调用执行装饰器
    #被装饰函数
    def f1(a1,a2,a3):
        a4 = a1 + a2
        print(a4)
        return a3
    
    #执行f1函数
    s1 = f1(3,5,"林贵秀")
    print(s1)
    # 在执行被装饰函数前添加功能
    # 8
    # 在执行被装饰函数后添加功能
    # 林贵秀

     

    装饰器之多个装饰器装饰同一个函数(重点)

    装饰器之多个装饰器装饰同一个函数,是从被装饰函数最近的一个装饰器调用开始的,依次从下到上的将装饰器内层函数赋值叠加给上一个装饰器,等到达最上层调用装饰器时在一步一步向叠加的函数里面解析,将最后结果返回给最上层调用装饰器在返回给被装饰函数

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    #装饰器之多个装饰器装饰同一个函数,注意注释说明的步骤
    #装饰器函数1
    def zh(sh): #第一步将zh装饰器函数放入内存,第五步执行zh装饰器函数
        def zhshi(*args,**kwargs):
            print("在执行被装饰函数前添加功能")  #打印字符串
            r =  sh(*args,**kwargs)     #注意此时的sh函数就是zh2装饰器函数的内层函数zhshi2,也就是执行的zhshi2()函数
            print("在执行被装饰函数后添加功能")  #打印字符串
            return r    #返回zhshi2函数的返回值
        return zhshi
    #装饰器函数2
    def zh2(sh):    #第二步将zh2装饰器函数放入内存,第四步将zh2装饰器函数名和它的参数传入zh装饰器函数
        def zhshi2(*args,**kwargs):
            print("额外增加")
            r =  sh(*args,**kwargs)
            return r
        return zhshi2
    @zh
    @zh2    #第三步执行zh2装饰器函数并且把f1函数名和它的参数传入zh2装饰器函数
    def f1(a1,a2,a3):
        a4 = a1 + a2
        print(a4)
        return a3
    
    #执行f1函数
    s1 = f1(3,5,"林贵秀")
    print(s1)
    #打印出
    # 在执行被装饰函数前添加功能
    # 额外增加
    # 8
    # 在执行被装饰函数后添加功能
    # 林贵秀

     

  • 相关阅读:
    MySQL系列(四)--数据库结构优化、范式化与反范式化
    Java数据结构和算法(二)--队列
    Java数据结构和算法(一)--栈
    MySQL系列(三)--MySQL存储引擎
    Java集合(六)--ArrayList、LinkedList和Vector对比
    Java集合(五)--LinkedList源码解读
    Java集合(四)--基于JDK1.8的ArrayList源码解读
    P1048 采药(洛谷,动态规划递推,01背包原题)
    P1091 合唱队形题解(洛谷,动态规划LIS,单调队列)
    语法摔过的坑(用来给自己看的,粗糙,勿点)
  • 原文地址:https://www.cnblogs.com/adc8868/p/5726253.html
Copyright © 2011-2022 走看看