python 裝飾器前之閉包和裝飾器

2022-04-01 02:01:26 字數 1862 閱讀 3965

裝飾器:

一, 例如:

#vim yue7.py

deffoo():

print ("

fool-------------------")

foo()

執行:[root@localhost python]

#python yue7.py

fool-------------------二,要求:要在上述函式不改變函式呼叫方式的情況下增加**執行的時間。

#yue6.py

import

time

defshow_time(f):

def inner(): #

條件1:內部函式;

start =time.time()

f()

#條件2:對外部環境的引用 foo()

end =time.time()

print ("

spend --%s s ---

" %(end-start))

return

inner

deffoo():

print ("

fool-------------------")

time.sleep(2)

foo = show_time(foo) #

.inner at 0x7f1686630488> (此時的foo只是乙個記憶體位址)

foo()

執行結果:

[root@localhost python]

#python yue6.py

fool-------------------spend --2.0029256343841553 s ---三,對上面的**進行改進,用裝飾器修飾。

#vim yue5.py

import

time

defshow_time(f):

definner():

start =time.time()

f()end =time.time()

print ("

spend --%s s ---

" %(end-start))

return

inner

@show_time

#foo = show_time(foo)(裝飾器)

deffoo():

print ("

fool-------------------")

time.sleep(2)

foo() #呼叫

執行結果:

[root@localhost python]

#python yue5.py

fool-------------------spend --2.00250244140625 s ---

四,閉包:

#vim yue4.py

defouter():

x = 10

def inner(): #

條件1: inner是內部函式,相對於outer函式來說;

print (x) #

條件2:print(x)是對外部環境變數x=10的引用;

return

inner

#outer()()

f =outer()

f()[root@localhost python]

#python yue4.py

10結論:內部函式inner就是乙個閉包。

python之閉包和裝飾器

閉包函式必須滿足兩個條件 1.函式內部定義的函式 2.包含對外部作用域而非全域性作用域的引用 如下閉包函式 def callfunc n 1 def show print show n return show s callfunc s 程式在執行時,callfunc 函式返回了內部定義的 show ...

python之裝飾器和閉包

在了解裝飾器之前,我們先來了解一下閉包,因為裝飾器的本質也是閉包。閉包 乙個函式定義中引用了函式外定義的變數,並且該函式可以在其定義環境外被執行,這樣乙個函式稱之為閉包。概念比較抽象,我們直接看 def outer func loc list def inner func name print lo...

python裝飾器和閉包

下面幾個部落格有裝飾器的講解,也包含了裝飾器幾種情況的例子,比如說被裝飾的函式帶引數,裝飾器本身帶引數等。理解python中的裝飾器 python裝飾器學習 例子 其實裝飾器跟設計模式中的裝飾器模式基本一樣,就是在已有的函式上新增新的功能,這也是自己對裝飾器的一點簡陋的理解了。下面是自己寫的簡單例子...