首页 > 代码库 > 闭包函数与装饰器
闭包函数与装饰器
闭包
闭包函数: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()
闭包函数与装饰器
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。