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

posted @ 2023-07-19 02:01  fangpinz  阅读(13)  评论(0编辑  收藏  举报