• Python学习之装饰器进阶


    函数知识回顾:

    函数的参数分为:实参和形参。

    实参:调用函数的时候传入的参数;

    形参:分为3种(位置参数、默认参数、动态传参)

    位置参数:必须传值

    def aaa(a,b):
        print(a,b)
    aaa(1,2)

    默认参数:不是必须传参数

    def bbb(x=10):
        print(x)
    # bbb()  #x = 10
    # bbb(20) #x = 20

    动态传参

    def ccc(*args):#1,2,3,4,5
        print(args)
    
    ccc(1,2,3,4,5)#按位置传参数
    
    t = (1,2,3,4,5)
    ccc(t)  ((1, 2, 3, 4, 5),)
    ccc(*t)  (1, 2, 3, 4, 5)
    def ddd(**kwargs):
        print(kwargs)
    
    # ddd(k = 'a',j = 'b')#按关键字传参数
    def eee(*args,**kwargs):
        print(args,kwargs)
    
    # eee(12,123) #先按位置传参,再按关键字传参
    def ccc(*args):
        print('ccc:',args)  #(1,2,3,4,5)聚合
        def inner(a,b,c,d,e):
            print('inner',a,b,c,d,e)
        inner(*args)  #*(1,2,3,4,5)  打散

    装饰器(完整解释版)

    def wrapper(func):
        def inner(*args,**kwargs):#定义函数的时候——*参数的聚合
            ret = func(*args,**kwargs)  #调用函数的时候——*参数的打散
            #func是被装饰的函数,ret是被装饰函数的返回值
            return ret #把被装饰的函数的返回值返回给调用者
        return inner
    @wrapper   #hahaha = wrapper(hahaha)
    def hahaha(a,b):
        return a+1,b+1
    
    ret = hahaha(1,2)
    print(ret)

     装饰器的高级应用:一个装饰器被几个函数调用和一个装饰器被调用的次数、一个函数被多个装饰器装饰、带参数的装饰器。

    一个装饰器被几个函数调用:

    l=[]#存放调用的函数
    def wrapper(func):
        l.append(func)#统计有几个函数调用
        def inner(*args,**kwargs):
            ret=func(*args,**kwargs)
            return ret
        return inner
    @wrapper
    def f1():
        print('in f1')
    @wrapper
    def f2():
        print('in f2')
    print(l)

    一个装饰器被调用的次数:

    l=[]#存放调用的函数
    def wrapper(func):
       # l.append(func)#统计有几个函数调用
        def inner(*args,**kwargs):
            l.append(func)#统计被调用了几次
            ret=func(*args,**kwargs)
            return ret
        return inner
    @wrapper
    def f1():
        print('in f1')
    @wrapper
    def f2():
        print('in f2')
    f1()
    f1()
    f2()
    f2()
    print(l)

    一个函数被几个装饰器装饰:

    def qqxing(func):
        def inner(*args,**kwargs):
            print('before,inqqxing')
            ret= func(*args,**kwargs)
            print('inqqxing,after')
            return ret
        return inner
    def pipia(func):
        def inner(*args,**kwargs):
            print('beore,pipia')
            ret=func(*args,**kwargs)
            print('after ,pipia' )
            return ret
        return inner
    @qqxing
    @pipia
    def dapangxie():
        print('饿了么')
    dapangxie()

    放大招带参数的装饰器:

    F=True#装饰器的参数
    def outer(flag):#定义
        def wrapper (func):
            def inner(*args,**kwargs):
                if flag:
                    print('before')
                    ret=func(*args,**kwargs)
                    print('after')
                else:
                    ret = func(*args, **kwargs)
                return ret
            return inner
        return wrapper
    @outer(F)
    def hahaha():
        print('hahaha')
    @outer(F)
    def shuang():
        print('shuag')
    
    shuang()
    hahaha()

     装饰器的运行顺序

  • 相关阅读:
    【转】Senior Data Structure · 浅谈线段树(Segment Tree)
    1260:【例9.4】拦截导弹(Noip1999)
    1255:迷宫问题
    1253:抓住那头牛
    1254:走出迷宫
    POJ 3692 幼儿园做游戏 最大团 模板题
    POJ 1466 大学谈恋爱 二分匹配变形 最大独立集
    POJ 3422 矩阵取数 最小费用流拆点+负边
    POJ 2195 一人一房 最小费用流 建图 水题
    POJ 3068 运送危险化学品 最小费用流 模板题
  • 原文地址:https://www.cnblogs.com/1a2a/p/7252486.html
Copyright © 2020-2023  润新知