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

闭包和装饰器

时间:2019-09-24 08:28:39      阅读:45      评论:0      收藏:0      [点我收藏+]

标签:int   参数   *args   pytho   def   app   代码   UNC   star   

闭包和装饰器

什么是闭包

闭包从字面意思上理解就是封闭包含,表现形式就是一个函数包含着另外一个函数。闭包是指:函数内部函数对外部作用域而非全局的引用

def outter():
    x = 1
    def inner():
        print(x)
    return inner # 返回inner函数对象

f = outter() # 返回函数对象
f() # 调用inner, 会打印1

# 还可为外层函数传入参数

def outter(x):
    def inner():
        print(x)
    return inner

f = outter(1)
f() # 同样打印1
##

闭包的意义

返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域。

什么是装饰器

什么是装饰器

为被装饰对象增加新的功能,而不改变被装饰对象的代码和调用方式。

  • 装饰器本身其实是任意可以调用的对象
  • 被装饰的对象可以是任意可调用的对象
import time

def test():
    print("test func")
    time.sleep(1)

def time_count(func):
    def wrapper():
        start = time.time()
        func()
        end = time.time()
        print(end - start)
    return wrapper

test = time_count(test) # 调用时会返回wrapper这个函数对象,通过赋值方式把它重新命名为test, 那么调用test就相当于调用wrappwer

# 如果test需要传入参数,还可以使用为其传入参数

def test(a, b):
    print("test func")
    time.sleep(1)

def time_count(func):
    def wrapper(*args, **kargs): # 在wrapper中使用*args, **kargs可以捕获所有参数
        start = time.time()
        func(*args, **kargs)
        end = time.time()
        print(end - start)
    return wrapper

test = time_count(test) 

语法糖

test = time_count(test) 
# 上面这种方式,可以使用下面的方法实现
@time_count
def test():
    print("test func")

带参数的装饰器

def test(a, b):
    print("test func")
    time.sleep(1)

def outter("arg1"):
    def time_count(func):
        def wrapper(*args, **kargs): # 在wrapper中使用*args, **kargs可以捕获所有参数
            print("use arg1")
            start = time.time()
            func(*args, **kargs)
            end = time.time()
            print(end - start)
        return wrapper
    return time_count
    
test = outter('args')(func) # 这样就可以为装饰器传入参数了

闭包和装饰器

标签:int   参数   *args   pytho   def   app   代码   UNC   star   

原文地址:https://www.cnblogs.com/YajunRan/p/11575992.html

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