1. 程式人生 > >python函數四(裝飾器進階)

python函數四(裝飾器進階)

開放 int col wrap 運行 lag 分享 none name

一。開放封閉原則

  1.對擴展是開放的

    任何一個程序,不可能在設計之初就已經想好了所有的功能並且未來不做任何更新和修改。所以我們必須允許代碼擴展、添加新功能。

  2.對修改是封閉的

    比如我們寫的一個函數,很有可能已經交付給其他人使用了,如果這個時候我們對其進行了修改,很有可能影響其他已經在使用該函數的用戶。

裝飾器完美的遵循了開放封閉原則。

二。函數的有用信息 

def func():
    ‘‘‘
    本函數主要用於繪圖,實時接收數據
    :return:返回給前端某標簽
    ‘‘‘
    print(func.__doc__)
    print(func.__name__
) func() # 結果: # 本函數主要用於繪圖,實時接收數據 # :return:返回給前端某標簽 # func

三。*args,**kwargs

def wrapper(func):
    def inner(*args,**kwargs):
        ‘‘‘執行函數前‘‘‘
        ret = func(*args,**kwargs)
        ‘‘‘執行函數後‘‘‘
        return ret
    return inner

@wrapper
def func(a,b,c,d):      #接收函數時,加個*聚合
    print
(111) func(1,2,3,4) # f1(*[1,2,3,4]) #執行函數時,加個*打散

四。裝飾器進階

  1.帶參數的裝飾器  

技術分享圖片
flag = True
def wrapper_out(flag):
    def wrapper(func):
        def inner(*args,**kwargs):
            ‘‘‘執行函數前‘‘‘
            if flag:
                ret = func(*args,**kwargs)
                ‘‘‘執行函數後‘‘‘
                print
(222) return ret else: ret = func() return ret return inner return wrapper @wrapper_out(flag) #第一步是調用 wrapper_out(flag),接收到返回值wrapper def func(): #第二步是@wrapper,即func = wrapper(func) print(111) func() # 輸出結果: # 111 # 222 # 當flag = False時,調用inner()時走else # 輸出結果: 111
View Code

  2.多個裝飾器裝飾一個函數

技術分享圖片
def wrapper1(func):
    def inner1(*args,**kwargs):
        ‘‘‘執行函數前‘‘‘
        print(222)
        ret1 =func(*args,**kwargs)
        ‘‘‘執行函數後‘‘‘
        print(333)
        return ret1
    return inner1

def wrapper2(func):
    def inner2(*args,**kwargs):
        ‘‘‘執行函數前‘‘‘
        print(555)
        ret2 = func(*args,**kwargs)
        ‘‘‘執行函數後‘‘‘
        print(666)
        return ret2
    return inner2

@wrapper1
@wrapper2
def func():
    print(111)
func()
#運行到@wrapper1時此時不運行,走下一步
#運行到@wrapper2時,func = wrapper2(func),此時得到的是  func = wrapper2(func),返回值是inner2 ,即func---->inner2
#之後再運行到@wrapper1,即func = wrapper1(inner2),返回值是inner1,即func----->inner1
#接著調用func(),即調用inner1()
# #再根據自上而下的運行規律即可以得到結果

# 輸出結果:
# 222
# 555
# 111
# 666
# 333
View Code

    

python函數四(裝飾器進階)