1. 程式人生 > >閉包函數

閉包函數

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 456
View Code

   裝飾器最多三層,最外層用來傳遞參數。

   多個裝飾器修飾同一個函數,有順序之分,@裝飾器修飾它正下方的函數。

閉包函數