zoukankan      html  css  js  c++  java
  • 闭包与装饰器

    闭包

    def func(y):
        def inner(x):
            req = x + y
            print("req", req)
        return inner
    v = func(3)
    v(2)
    

    闭包指的是内层函数引用了外层函数的变量并且外边函数返回内部函数,inner叫闭包函数。

    a = []
    for i in range(3):
        def inner(x):
            return x**i
        a.append(inner)
    for f in a:
        print(f(2))  # 结果是4 4 4
    

    上述代码中,for循环最后i已经被定义为2,第二个循环开始才运行了inner函数,故inner中的i始终是2。解决办法是在 a.append(inner(2))直接执行或者利用闭包:

    a = []
    for i in range(3):
        def func(i):
            def inner(x):
                return x**i
            return inner
        a.append(func(i))
    for f in a:
        print(f(2))
    

    此时inner函数并没有及时执行,append中执行的是外层函数,但是inner闭包函数仍记录当时的变量i。

    装饰器

    def deractor1(func):
        def inner(*args, **kwargs):
            print("derac1 ----")
            req= func(*args, **kwargs)
            print("derac1 ++++")
            return req
        return inner
    
    
    def deractor2(func):
        def inner(*args, **kwargs):
            print("derac2 ----")
            req= func(*args, **kwargs)
            print("derac2 ++++")
            return req
        return inner
    
    @deractor2
    @deractor1
    def func():
        print("now")
    
    deractor2(deractor1(func()))
    

    结果是:
    derac2 ----
    derac1 ----
    now
    derac1 ++++
    derac2 ++++
    多个装饰器应用的时候,类似django的中间件的正逆执行。

  • 相关阅读:
    HashMap于Hashtable的区别
    redis分布式锁
    mybatis基本认识
    怎么获取硬件线程数,Future,创建线程
    查看端口号有什么在用
    javaScript 中的字符操作
    获取类里面的所有属性
    给Date赋值
    实现多人聊天
    客户端与服务器端执行报重置问题
  • 原文地址:https://www.cnblogs.com/khal-Cgg/p/14630906.html
Copyright © 2011-2022 走看看