python閉包及裝飾器執行原理解析

2022-09-27 03:00:10 字數 1891 閱讀 7035

一、閉包

閉包從形式上來說是在外部函式中定義內部函式,並且內部函式引用了外部函式的變數,此變數叫做自由變數。

或者說是將組成函式的語句和這些語句的執行環境打包在一起。

閉包滿足的條件:

必須有乙個內嵌函式

內嵌函式必須使用外部函式的變數

外部函式的返回值必須是內嵌函式

def closure():

value =

def fun(tmp):

value.append(tmp)

return value

return fun

cc = closure()

cc(程式設計客棧0) #[0] 等同於closure(fun(0))

cc(1) #[0,1]

cc(2) #[0,1,2]

外部函式closure中有變數value和內部函式fun,並且內部函式fun引用了自由變數value,當執行cc = closure()時,就產生了乙個閉包fun,該閉包持有只有變數value,當函式closure生命週期結束後,value依然存在,因為它被閉包引用了。

二、裝飾器

裝飾器其實就是閉包的應用,只不過其傳遞的是函式。

def add_time(fun):

def wrapper():

print('time: 12:00')

return fun()

return wrapper

def add_format(fun):

def wrapper():

print('\n')

return fun()

return wrapper

@add_format #等同於demo = add_format(add_time(demo))

@add_time #等同於 demo = add_time(demo)

def demo():

return 'hello world!'

另外,裝飾器會將demo函式的元資訊丟失,例如__name__等等。

例如demo函式的__name__會由'demo'變成了'wrapper',xpapqohlm這時需要用到functools庫,在wrapper函式前加上@functools.wraps(fun):

import functools

def add_time(fun):

@functools.wraps(fun)

def wrapper():

print('time: 12:00')

return fun()

return wrapper

def add_format(fun):

@functools.wraps(fun)

def wrapper程式設計客棧():

print('\n')

return fun()

return wrapper

@add_format #等同於demo = add_format(add_time(demo))

@add_time #等同於 demo = add_time(demo)

def demo():

return 'hello world!'

例如給任意函式加上列印時間的功能的裝飾器:

def metric(fn):

start=time.time()

def wrapper(*args,**kw):

end=time.time()

prxpapqohlmint('%s executed in %s ms' % (fn.__name__,start-end))

return fn(*args,**kw)

return wrapper

本文標題: python閉包及裝飾器執行原理解析

本文位址:

Python閉包及裝飾器

先看乙個例子 def outer x definner y return x y return innder add outer 8 print add 6 我們定義了乙個方法outer,方法內部又定義了乙個方法inner,方法outer返回值為內部定義的方法inner。同時,內部方法innder使...

Python 閉包及裝飾器

閉包是指延伸了作用域的函式。自由變數 free variable 指未在本地作用域中繫結的變數 函式裝飾器用於在原始碼中標記函式,以某種方式增強函式的行為。裝飾器實質,把被裝飾的函式替換為新函式,二者接收相同的引數,繫結了被裝飾函式最為自由變數,返回被裝飾函式本該返回的值,同時還會做些額外操作 裝飾...

Python 裝飾器 ,閉包

1 裝飾器 不改變被裝飾的函式情況下附加一些功能 本質是函式,用於裝飾其他函式,附加一些本身所沒有的功能 實質 是乙個函式 引數 是你要裝飾的函式名 並非函式呼叫 返回 是裝飾完的函式名 也非函式呼叫 作用 為已經存在的物件新增額外的功能 特點 不需要對物件做任何的 上的變動 例1 計算執行時長 i...