#闭包
'''
闭包
内部函数包含对外部变量的引用,
在通过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 可以将原函数对象的指定属性复制给包装函数对象, 默认有 module、name、doc
"""
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