python中的闭包和装饰器

#闭包
'''
闭包
内部函数包含对外部变量的引用,
在通过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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容