闭包函数与装饰器

Posted 俊先生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闭包函数与装饰器相关的知识,希望对你有一定的参考价值。

闭包
闭包函数: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()

 

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

python11 装饰器与闭包

闭包与装饰器

闭包函数与装饰器

python 闭包与装饰器

闭包函数,装饰器

python3命名空间与作用域,闭包函数,装饰器