python中的闭包、装饰器(decorator)

闭包

什么是闭包?

在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包。

所谓闭包:就是在一个函数内定义了一个函数f,并且这个函数f引用外部变量,在把这个函数f当做返回值返回

闭包demo

#定义一个函数
def test(number):

    def test_in(number_in):
        print("in test_in 函数, number_in is %d"%number_in)
        return number+number_in
        
    return test_in    # 其实这里返回的就是闭包的结果


#给test函数赋值,这个20就是给参数number
ret = test(20)

#注意这里的100其实给参数number_in
print(ret(100))

#注意这里的200其实给参数number_in
print(ret(200))

运行结果:

in test_in 函数, number_in is 100
120

in test_in 函数, number_in is 200
220

装饰器(decorator)

什么是装饰器?

装饰器:在不改变函数(当然还有其他的)的代码和调用方式的前提下,为函数增加新的功能!

装饰器常见的应用场景?

1.引入日志
2.函数执行时间统计
3.执行函数前预备处理
4.执行函数后清理功能
5.权限校验等场景
6.缓存

装饰器demo

import functools

def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print('call %s():' % func.__name__)
        print('args = {}'.format(*args))
        return func(*args, **kwargs)

    return wrapper
# 这样就定义了一个打印出方法名及其参数的装饰器。

@log
def test(p):
    print(test.__name__ + " param: " + p)

# 调用    
test("I'm a param")

程序运行输出:

call test():
args = I'm a param
test param: I'm a param

值得注意的是@functools.wraps(func),这是python提供的装饰器。它能把原函数的元信息拷贝到装饰器里面的 func
函数中。函数的元信息包括docstring、name、参数列表等等。可以尝试去@functools.wraps(func),你会发现test.__name__的输出变成了wrapper。

发布了38 篇原创文章 · 获赞 10 · 访问量 7181

猜你喜欢

转载自blog.csdn.net/chenxuezhong0413/article/details/100657489