美文网首页
python中的闭包和装饰器

python中的闭包和装饰器

作者: 邹霉霉 | 来源:发表于2018-06-18 11:13 被阅读0次
#闭包
'''
闭包
内部函数包含对外部变量的引用,
在通过python的语言介绍一下,一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。
这个返回的函数B就叫做闭包。
你在调用函数A的时候传递的参数就是自由变量。

print(f.__closure__)   <cell at 0x101fa6318: int object at 0x101f96f50>
print(f.__closure__[0].cell_contents)
print(f.__closure__[2].cell_contents)
'''

x = 1
def A(x):
    y = 2
    z = 3
    def B():
        # x+=1 # 报错 local variable 'x' referenced before assignment,
        # 解决,声明nonlocal x ,即可
        print(x, y, z)
    return B
f = A(4)
f()




#装饰器
'''
装饰器就是一种的闭包的应用,只不过其传递的参数是函数:
'''
def timer(func):
    def wrapper(*args, **kwargs):
        print("1")
        res = func(*args,**kwargs)
        print("2")
        return res
    return wrapper

@timer
def foo(a):
    print(a)

# foo(3)

functools.wraps用法

"""
2.装饰器wraps解释
functools.wraps 是 装饰器的装饰器
functools.wraps 可以将原函数对象的指定属性复制给包装函数对象, 默认有 modulenamedoc

"""

from functools import wraps
def logged(func):
    @wraps(func)
    def with_logging(*args, **kwargs):
        print(func.__name__ + " was called")
        return func(*args, **kwargs)
    return with_logging

@logged
def f(x):
   """does some math"""
   return x + x * x


print(f.__name__)  # 加wraps装饰器 f此时输出是函数本身名字f
def logged(func):
    def with_logging(*args, **kwargs):
        print(func.__name__ + " was called")
        return func(*args, **kwargs)
    return with_logging

@logged
def f(x):
   """does some math"""
   return x + x * x


print(f.__name__)  # 不加wraps装饰器,此时输出with_logging

相关文章

网友评论

      本文标题:python中的闭包和装饰器

      本文链接:https://www.haomeiwen.com/subject/yrqneftx.html