python闭包函数
闭包(函数)避免了使用全局变量。
一般来说,当对象中只有一个方法时,这时使用闭包是更好的选择。
所有函数都有一个__closure__属性,如果这个函数是一个闭包,那么其__closure__属性是一个由cell对象组成的元组对象。
cell对象的cell_contents属性就是闭包函数所关联的自由变量
def decorator(func): dic = {} print(dic, '....') def wrapper(*args): if args in dic: print(f'no calculator, dic ={dic}') return dic[args] value = func(*args) dic[args] = value print(f'calculator, dic = {dic}') return func(*args) return wrapper @decorator def add(a, b, c): return a + b + c print(add(1, 2, 3)) print(add(1, 2, 3)) print(add(4, 5, 6)) print(add(4, 5, 6)) print(add.__closure__) import types for cell in add.__closure__: if isinstance(cell.cell_contents, types.FunctionType): print(cell.cell_contents.__name__) else: print(cell.cell_contents)
{} ....
calculator, dic = {(1, 2, 3): 6}
6
no calculator, dic ={(1, 2, 3): 6}
6
calculator, dic = {(1, 2, 3): 6, (4, 5, 6): 15}
15
no calculator, dic ={(1, 2, 3): 6, (4, 5, 6): 15}
15
(<cell at 0x0000019C1D102B60: dict object at 0x0000019C1CC90500>, <cell at 0x0000019C1D102DA0: function object at 0x0000019C1D11F9A0>)
{(1, 2, 3): 6, (4, 5, 6): 15}
add
学习开心就好