裝飾器和閉包理解(一)

'''
@Descripttion: 
@version: 
@Author: 馮浩
@Date: 2019-10-21 15:19:54
@LastEditors: 馮浩
@LastEditTime: 2019-10-21 16:02:34
'''
#例子一
def deco1(func):# 裝飾器
    def inner():
        print('裝飾器內部函數')
    return inner

#原始表達方式, 裝飾器其實就是該方式的語法糖
def example0():
    print('原始函數')

print(id(example0))
example0 = deco1(example0) #本行即爲裝飾器本質
print(id(example0))
print('*'*32)
example0() #執行替換後的本函數

#裝飾器表達法,裝飾器能夠理解爲函數調用的簡化表達
@deco1
def example1():
    print('原始函數')
print(
'-'*32) example1() #執行裝飾器表達後的本函數 '''
執行結果以下:
63866536 60649120 ******************************** 裝飾器內部函數 -------------------------------- 裝飾器內部函數 ''' 補充:example1()表是調用函數的執行結果,example1表示調用函數自己(函數並未執行)

 

'''
@Date: 2019-10-20 23:05:26
@LastEditors: 馮浩
@LastEditTime: 2019-10-21 23:58:33
'''

registry=[]
def register (func):#裝飾函數
    print('runnig register is %s'% func)
    registry.append(func)
    return func

@register
def f1():
    print('執行f1')

@register
def f2():
    print('執行f2')

def f3():
    print('執行f3')

def main():
    print('-'*32,'\n開始執行')
    print('已執行:', registry)
    f1()
    # f2()
    f3()

if __name__ == "__main__":
    main()

'''
執行結果以下:
runnig register is <function f1 at 0x00000000039FC1E0>
runnig register is <function f2 at 0x00000000039FC268>
--------------------------------
開始執行
已執行: [<function f1 at 0x00000000039FC1E0>, <function f2 at 0x00000000039FC268>]
執行f1
執行f3
 結論,裝飾函數在導入模塊時馬上執行,而被裝飾函數只在明確調用時運行 能夠看到,f2未被調用,可是其裝飾函數先行執行了. '''
相關文章
相關標籤/搜索