python3 閉包函數,裝飾器

閉包函數:
一、定義在函數內部的函數
二、包含對外部做用域而非全局做用域的引用
特色:
一、自帶做用域
二、延遲計算(取到內存地址,加括號執行)

def 外部函數(func):
def 內部函數(*args,**kwargs):
pass
return 內部函數

f=外部函數(func)

print(f.__closure__)
print(f.__closure__[0].cell_contents)

def f1():
    name = 'egon'
    money = 10
    def tell_ino():
        print('%s have money %s' %(name, money))
    return tell_ino()

f1()

 

    優勢:
1 自帶做用域
2 惰性延遲


*********************************************************************************
一、開放封閉原則,對擴展是開房的,對修改是封閉的
二、裝飾器:裝飾器本質是能夠任意調用對象,被裝飾的對象也能夠是任意可調用對象
功能:在不修改被裝飾對象源代碼以及調用方式的前提下,對其添加新功能
原則:
一、不修改源代碼
二、不修改調用方式
目標:添加新功能
*********************************************************************************


裝飾器
1 開放封閉原則:對擴展開放,對修改(修改源代碼和調用方式)是封閉的

2 什麼是裝飾器:裝飾器本質是任意可調用對象,被裝飾器對象也能夠是任意可調用對象
裝飾器遵循的原則:不修改被裝飾對象的源代碼和調用方式

3 定義裝飾器

def 外部函數(func):
def 內部函數(*args,**kwargs):
pass
return 內部函數

4 裝飾器的語法:@
1.卸載被裝飾對象的正上方單獨一行
2.可疊加多個,執行順序是自下而上
定義階段外部函數的執行順序是自下而上
調用階段內部函數的執行順序是自上而下
@timmer #index=timmer(index)
def index():
pass
import time
import random

def timmer(func):
    # func = index
    def wrapper():
        start_time = time.time()
        func()
        stop_time = time.time()
        print('run time is %s' %(stop_time - start_time))
    print(wrapper)
    return wrapper

@timmer
def index():
    time.sleep(random.randrange(1,2))
    print('welcome to my index page !')

# index = timmer(index)
index()
相關文章
相關標籤/搜索