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()
View Code

三、装饰器

(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()
View Code

  (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)
View Code

  (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()
View Code

 



以上是关于day10-闭包函数函数装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python基础day-7[闭包,装饰器]

day12.1_闭包函数+装饰器

python 函数名 闭包 装饰器 day13

021day--python装饰器

Python开发基础-Day7-闭包函数和装饰器基础

day4-装饰器和模块导入