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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容