码迷,mamicode.com
首页 > 其他好文 > 详细

闭包函数

时间:2017-10-22 01:38:45      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:装饰器   全局   run   time   fun   帮助信息   div   play   index   

一、闭包函数的定义

       定义在函数内部的函数,特点是包含对外部作用域而不是全局作用域名字的引用,该函数称之为闭包函数。      

   参数传递两种方法:

  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

   装饰器最多三层,最外层用来传递参数。

   多个装饰器修饰同一个函数,有顺序之分,@装饰器修饰它正下方的函数。

 

 

 

 

 

 

 

 

       

 

闭包函数

标签:装饰器   全局   run   time   fun   帮助信息   div   play   index   

原文地址:http://www.cnblogs.com/yangyuelin/p/7705984.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!