1. 程式人生 > >Python學習之裝飾器進階

Python學習之裝飾器進階

放大 python學習 else pen 裝飾 dap style pri aaa

函數知識回顧:

函數的參數分為:實參和形參。

實參:調用函數的時候傳入的參數;

形參:分為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學習之裝飾器進階