zoukankan      html  css  js  c++  java
  • 四 闭包函数、装饰器

    一 闭包函数

      一、什么是闭包

      二、闭包的意义与应用

    二 装饰器

      一、为何要用装饰器

      二、什么是装饰器

      三、装饰器的作用

      四、装饰器的语法

      五、装饰器补充: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__)
  • 相关阅读:
    pongo英雄会-幸运数题解
    求最大公约数的算法
    第二课、GUI程序实例分析------------------狄泰软件学院
    第一课、GUI程序原理分析------------------狄泰软件学院
    第六十八课、拾遗:令人迷惑的写法
    第六十七课、经典问题解析五
    第六十六课、c++中的类型识别
    第六十五课、c++中的异常处理(下)
    第六十四课、c++中的异常处理(上)
    第六十三课、C语言的异常处理
  • 原文地址:https://www.cnblogs.com/eric_yi/p/8449148.html
Copyright © 2011-2022 走看看