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