闭包函数与装饰器
Posted 俊先生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闭包函数与装饰器相关的知识,希望对你有一定的参考价值。
闭包
闭包函数:1.函数内部定义的函数,成为内部函数
2.该内部函数包含对外部作用域,而不是对全局作用域名字的引用
特点:自带作用域
延迟计算
closure<包含的作用域>
定义闭包函数的基本形式
def 外部函数名():
内部函数需要的变量
def 内部函数():
引用外部变量
return 内部函数
def f1(): name=‘good‘ def f2(): print(name) return f2
包两层 def aaa(): name=‘egon‘ def wrapper(): money=1000 def tell_info(): print(‘egon have money %s‘ %(money)) print(‘my namn is %s‘ %name) return tell_info return wrapper w=aaa() tell_info=w() print(tell_info.__closure__[0].cell_contents) print(tell_info.__closure__[1].cell_contents)
‘‘‘
报错NameError: name ‘money‘ is not defined
原因:
函数的作用域关系在函数定义阶段就已经固定,与调用位置无关
无论函数在何处调用,都需要回到定义阶段去找对应的作用域关系
此例:虽然tell_info(‘egon‘)是在foo内调用并且引用money,但仍需要回到定义
tell_info的阶段去找作用域关系,而定义时tell_info引用的money就是全局的money
如果全局不存在则抛出异常NameError
‘‘‘
装饰器:
‘‘‘
一:开放封闭原则,对扩展是开放的,对修改是封闭的
二:装饰器,装饰器本质可以任意可调用对象,被装饰的对象也可以是任意可调用对象
装饰器的功能是:
在不修改被装饰对象源代码以及被装饰对象的调用方式的前提下为其添加新功能
原则:
1.不修改源代码
2.不修改调用方法
目标:添加新功能
‘‘‘
装饰器的语法:
在被装饰对象的正上方的单独一行,@装饰器名字
#装饰器修订 import time import random #装饰器 def timmer(func): def wrapper(*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 wrapper #被装饰函数 @timmer def index(): time.sleep(random.randrange(1,5)) print(‘welecome to index page‘)
@timmer def home(name): time.sleep(random.randrange(1,3)) print(‘welecome to %s HOME page‘ %name) return 123123123123 index()
#加多个装饰器 import time import random #装饰器 def timmer(func): def wrapper(): start_time = time.time() func() stop_time=time.time() print(‘run time is %s‘ %(stop_time-start_time)) return wrapper def auth(func): def deco(): name=input(‘name: ‘) password=input(‘password: ‘) if name == ‘egon‘ and password == ‘123‘: print(‘login successful‘) func() #wrapper() else: print(‘login err‘) return deco #被装饰函数 @auth #index=auth(wrapper) #index=deco #index=auth(wrapper) #index=deco @timmer #index=timmer(index) #index=wrapper def index(): # time.sleep(random.randrange(1,5)) time.sleep(3) print(‘welecome to index page‘) def home(): time.sleep(random.randrange(1,3)) print(‘welecome to HOME page‘) # index() #deco() # home()
以上是关于闭包函数与装饰器的主要内容,如果未能解决你的问题,请参考以下文章