python裝飾器簡述

2021-09-29 21:42:23 字數 3611 閱讀 8458

python作用域是乙個容易掉坑的地方,python 的作用域一共有 4 中,分別是:

1.l 區域性作用域

2. e閉包函式,外的函式中

3. g 全域性作用域

4. b 內建作用域

以 l –> e –> g –>b 的規則查詢,即:在區域性找不到,便會去區域性外的區域性找(例如閉包),再找不到就會

去全域性找,再者去內建中找

注意:python 除 了 calss 、def、lambad ,之外,其他 if/elif/else,try/except for /while 定義在他們內部的變數,外部還是可以訪問的,但是並不能改變作用域

if

true

: a=

10000

#定義在if 內的變數,在外部還是可以訪問的但是如果 if 被 class和def 包裹,那就按照區域性變數來處理了

print

(a)```

如果在class 和 def 內部賦值,就是區域性作者用域,區域性作用域的變數可以覆蓋全域性作用域的變數,但是 不能改變全域性作用域的變數

```python

g=1000

#全域性變數

defa()

: g=

2return g

print

( a())

#這個是列印出 區域性變數g 結果為1000

print

(g)#列印的是全域性變數g1,結果為2

**

**閉包的定義 : 如果在乙個內部函式裡 , 對在外部函式內 ( 但 不是在全域性作用域 ) 的變數進行引用 , 那麼內

部函式就被認為是閉包

def

func

(name)

:def

inner_func

(age)

:print

('name:'

, name,

'age:'

, age)

return inner_func

bb = func(

'nathaniel'

)bb(26)

# name: nathaniel age: 26

這裡面呼叫 c func 的時候就產生了乙個

這裡面呼叫 c func 的時候就產生了乙個閉包 —— inner_func, 並且該閉包持有自由變數 —— name ,因此這

也意味著,當函式 c func 的生命週期結束之後,e name 這個變數依然存在,因為它被閉包引用了,所以不會被

** ,閉包延長了區域性變數的生命週期

1、函式名可作為引數傳遞

2、函式名可以賦值給其他變數

3、函式名可以作為返回值

def foo1

**裝飾器其實也是簡單的函式,是在不改變原有的函式**的情況下,增加新的功能

看如下**乙個簡單的裝飾器例子show_time 是func1 的裝飾器

import time

defshow_time

(func)

:#裝飾器函式呼叫原來函式並返回乙個新的函式

definner()

: start=time.time(

) func(

) end=time.time(

)print

('函式執行時間為:%s'

%(end-start)

)return inner(

)@show_time

deffunc1()

:print

('func1'

) time.sleep(5)

print

('func1 again'

)

帶參函式的裝飾,見下面的**:

import time

defshow_time2

(func)

:def

inner

(value)

: start=time.time(

) func(value)

end=time.time(

)print

('總歸花費時間 %s'

%(end-start)

)return inner

@show_time2

deffunc2

(value)

:print

(value)

time.sleep(3)

print

('%s again'

% value)

print

(type

(value)

)func2(

123)

多引數的情況:

import  time

defshow_time

(func)

:def

inner

(*args)

: start=time.time(

) func(

*args)

time.sleep(1)

end=time.time(

)print(%

(end-start)

)return inner

@show_time

defadd

(*args)

:sum=0

print

('運算前的值sum:'

,sum

)for i in args:

sum+=i

time.sleep(1)

print

('運算後的:'

,sum

)add(1,

2,3,

4)

裝飾器其實也是乙個函式, , 如果難以理解, , 可以將其記為一種特定的格式 like

裝飾器將需要修飾的功能函式作為引數傳入 ==> 意味著裝飾器需要接受乙個引數, , 我們將需要修飾的函式作為

引數傳入

裝飾器內建乙個函式並返回這個內建函式

在內建函式中呼叫需要修飾的功能函式( ( 這裡用到了引數, ), 並增加新功能

@show_time 相當於 add = = show_time(add)

得益於 於 python 強大的功能 ,python 的函式可以像普通物件一樣存在, , 可以作為引數傳遞給另乙個函式也可以被

重新賦值

Python基礎 裝飾器簡述

作用 向原本的函式新增功能,但是不改變原函式的內部結構 在 執行期間,可以動態增加函式功能的方式,被稱為裝飾器 decorator 也就是說,在不修改原函式的基礎上,給原函式增加功能 好處 在團隊開發中,如果兩個或者兩個以上的程式設計師會用到相同的功能,但是功能又有細微的差別,採用裝飾器 相互不影響...

python裝飾器 Python 裝飾器

簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...

python裝飾器 裝飾器

由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...