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

四 闭包函数、装饰器

时间:2018-02-15 00:40:52      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:drive   分享图片   url   nbsp   com   local   *args   场景   onclick   

一 闭包函数

  一、什么是闭包

  二、闭包的意义与应用

二 装饰器

  一、为何要用装饰器

  二、什么是装饰器

  三、装饰器的作用

  四、装饰器的语法

  五、装饰器补充:wraps

 

一 闭包函数

一、什么是闭包

 1 #内部函数包含对外部作用域而非全局作用域的引用
 2 
 3 #提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路
 4 
 5         def counter():
 6             n=0
 7             def incr():
 8                 nonlocal n
 9                 x=n
10                 n+=1
11                 return x
12             return incr
13 
14         c=counter()
15         print(c())
16         print(c())
17         print(c())
18         print(c.__closure__[0].cell_contents) #查看闭包的元素

 

二、闭包的意义与应用

 1 #闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
 2 #应用领域:延迟计算(原来我们是传参,现在我们是包起来)
 3     from urllib.request import urlopen
 4 
 5     def index(url):
 6         def get():
 7             return urlopen(url).read()
 8         return get
 9 
10     baidu=index(http://www.baidu.com)
11     print(baidu().decode(utf-8))

 

二 装饰器(装饰器就是闭包函数的一种应用场景)

一、为何要用装饰器

#开放封闭原则:对修改封闭,对扩展开放

 

二、什么是装饰器

1 # 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
2 # 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式
3 # 装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能

 

三、装饰器的作用

技术分享图片
 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()
无参装饰器
技术分享图片
 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 == egon 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(egon)
22 
23 有参装饰器
有参装饰器

 

四、装饰器的语法

1 # 被装饰函数的正上方,单独一行
2         @deco1
3         @deco2
4         @deco3
5         def foo():
6             pass
7 
8         foo=deco1(deco2(deco3(foo)))

 

五、装饰器补充:wraps

 1 from functools import wraps
 2 
 3 def deco(func):
 4     @wraps(func) #加在最内层函数正上方
 5     def wrapper(*args,**kwargs):
 6         return func(*args,**kwargs)
 7     return wrapper
 8 
 9 @deco
10 def index():
11     ‘‘‘哈哈哈哈‘‘‘
12     print(from index)
13 
14 print(index.__doc__)

 

四 闭包函数、装饰器

标签:drive   分享图片   url   nbsp   com   local   *args   场景   onclick   

原文地址:https://www.cnblogs.com/eric_yi/p/8449148.html

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