Python学习之装饰器进阶

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()

 

以上是关于Python学习之装饰器进阶的主要内容,如果未能解决你的问题,请参考以下文章

基础学习之第十二天(装饰器的进阶)

Python学习之面向对象进阶

Python学习之装饰器

python学习之-装饰器

python学习之装饰器

Python学习之三大名器-装饰器迭代器生成器