閉包函數
阿新 • • 發佈:2017-10-22
font login 順序 原則 全局 blog 幫助信息 stat isp
一、閉包函數的定義
定義在函數內部的函數,特點是包含對外部作用域而不是全局作用域名字的引用,該函數稱之為閉包函數。
參數傳遞兩種方法:
1.傳參
2.閉包
二、裝飾器
1.為什麽要用裝飾器:開放封閉原則:對擴展是開放的,對修改是封閉的。
2.什麽是裝飾器
- 用來裝飾他人,裝飾器本身可是任意可調用函數,被裝飾的對象也可以是任意可調用對象
-遵循的原則:
1.不修改被裝飾對象的源代碼
2.不修改被裝飾對象的調用方式
-目標:在遵循原則1和2的前提下,為被裝飾對象添加新功能
裝飾器分類:無參裝飾器,有參裝飾器
另:如果想查看裝飾器內置函數的幫助信息需要導入 from functools import wraps,在inner函數正上方@wraps(func)
無參裝飾器示例
示例1:
import time from functools import wraps def timmer(func): @wraps(func)#將原始函數的幫助信息傳遞給inner函數 def inner(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print(‘run time is:[%s]‘%(stop_time-start_time)) return res return inner @timmer def index(): ‘‘‘ index function :return: ‘‘‘ time.sleep(3) print(‘welcome to index page‘) return 123 @timmer def home(name): ‘‘‘ home function :param name: :return:‘‘‘ time.sleep(2) print(‘welcome to home page %s‘ %name) return 456
示例2:
import time from functools import wraps current_state={‘user‘:None,‘login_status‘:False} def auth(func): @wraps(func) def inner(*args,**kwargs): if current_state[‘user‘] and current_state[‘login_status‘]: res = func(*args, **kwargs) return res username=input(‘請輸入用戶名:‘).strip() passwd=input(‘請輸入密碼:‘).strip() if username==‘egon‘ and passwd==‘123‘: current_state[‘user‘]=username current_state[‘login_status‘]=True print(‘login successfull‘) res = func(*args, **kwargs) return res return inner @auth def index(): time.sleep(3) print(‘welcome to index page‘) return 123 @auth def home(name): time.sleep(2) print(‘welcome %s to home page‘ %name) return 456View Code
裝飾器最多三層,最外層用來傳遞參數。
多個裝飾器修飾同一個函數,有順序之分,@裝飾器修飾它正下方的函數。
閉包函數