day10-闭包函数函数装饰器
Posted wcl0517
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day10-闭包函数函数装饰器相关的知识,希望对你有一定的参考价值。
一 什么是闭包?
闭包函数:
闭指的是:该函数是一个内部函数
包指的是:指的是该函数包含对外部作用域(非全局作用域)名字的引用
二 闭包的意义与应用
内部函数包含对外部作用域而非全局作用域的引用 提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路 def counter(): n=0 def incr(): nonlocal n x=n n+=1 return x return incr c=counter() print(c()) print(c()) print(c()) print(c.__closure__[0].cell_contents) #查看闭包的元素
闭包函数实例
1 import requests 2 3 def outter(url): 4 # url=‘https://www.baidu.com‘ 5 def get(): 6 response=requests.get(url) 7 if response.status_code == 200: 8 print(response.text) 9 return get 10 11 baidu=outter(‘https://www.baidu.com‘) 12 python=outter(‘https://www.python.org‘) 13 14 15 baidu() 16 baidu() 17 18 python() 19 python()
三、装饰器
(1)一 为何要用装饰器
开放封闭原则:对修改封闭,对扩展开放 软件的维护应该遵循开放封闭原则 开放封闭原则指的是: 软件一旦上线运行后对修改源代码是封闭的,对扩展功能的是开放的这就用到了装饰器 装饰器的实现必须遵循两大原则: 1、不修改被装饰对象的源代码 2、不修改被装饰对象的调用方式 装饰器其实就在遵循1和2原则的前提下为被装饰对象添加新功能
(2) 什么是装饰器
装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式
装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能
(3)装饰器的使用
(1)无参装饰器
1 import time 2 def timmer(func): 3 def wrapper(*args,**kwargs): 4 start_time=time.time() 5 res=func(*args,**kwargs) 6 stop_time=time.time() 7 print(‘run time is %s‘ %(stop_time-start_time)) 8 return res 9 return wrapper 10 11 @timmer 12 def foo(): 13 time.sleep(3) 14 print(‘from foo‘) 15 foo()
(2) 有参装饰器
1 def auth(driver=‘file‘): 2 def auth2(func): 3 def wrapper(*args,**kwargs): 4 name=input("user: ") 5 pwd=input("pwd: ") 6 7 if driver == ‘file‘: 8 if name == ‘isetan‘ and pwd == ‘123‘: 9 print(‘login successful‘) 10 res=func(*args,**kwargs) 11 return res 12 elif driver == ‘ldap‘: 13 print(‘ldap‘) 14 return wrapper 15 return auth2 16 17 @auth(driver=‘file‘) 18 def foo(name): 19 print(name) 20 21 foo(’isetan‘)
(4)装饰器语法
被装饰函数的正上方,单独一行 @deco1 @deco2 @deco3 def foo(): pass foo=deco1(deco2(deco3(foo)))
(5)装饰器补充
from functools import wraps def deco(func): @wraps(func) #加在最内层函数正上方 def wrapper(*args,**kwargs): return func(*args,**kwargs) return wrapper @deco def index(): ‘‘‘哈哈哈哈‘‘‘ print(‘from index‘) print(index.__doc__)
实例
1 import time 2 def tran(test): 3 def f1(): 4 start = time.time() 5 test() 6 stop = time.time() 7 print(‘程序运行时间为: %s‘%(stop-start)) 8 return f1 9 10 @ tran 11 def index(): 12 time.sleep(2) 13 print(‘来自底层的仰望!!!!!!!!!!!!‘) 14 15 index()
以上是关于day10-闭包函数函数装饰器的主要内容,如果未能解决你的问题,请参考以下文章