Pyhton函式式程式設計簡介(四)裝飾器

2021-08-15 00:21:00 字數 2025 閱讀 8275

4、python函式是乙個物件,函式執行完後內部變數被**;return的東西不會被**。

由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。

>>> def now():

... print('2015-3-25')

...>>> f = now

>>> f()

2015-3-25

# 函式物件有乙個__name__屬性,可以拿到函式的名字:

>>> now.__name__

'now'

>>> f.__name__

'now'

現在,假設我們要增強now()函式的功能,比如,在函式呼叫前後自動列印日誌,但又不希望修改now()函式的定義,這種在**執行期間動態增加功能的方式,稱之為「裝飾器」(decorator)。

本質上,decorator就是乙個 返回值為函式的 高階函式。所以,我們要定義乙個能列印日誌的decorator,可以定義如下:

# 注意格式

deflog

(func):

def(*args, **kw):

print('call %s():' % func.__name__)

return func(*args, **kw) #返回函式帶引數

觀察上面的log,因為它是乙個decorator,所以接受乙個函式作為引數,並返回乙個函式。我們要借助python的@語法,把decorator置於函式的定義處:

@log

defnow

(): print('2015-3-25')

呼叫now()函式,不僅會執行now()函式本身,還會在執行now()函式前列印一行日誌:

>>> now()

call

now():

2015-3-25

如果decorator本身需要傳入引數,那就需要編寫乙個返回decorator的高階函式,寫出來會更複雜。比如,要自定義log的文字:

def

log(text):

defdecorator

(func):

def(*args, **kw):

print('%s %s():' % (text, func.__name__))

return func(*args, **kw)

return decorator

#這個3層巢狀的decorator用法如下:

@log('execute')

defnow

(): print('2015-3-25')

# 執行結果如下:

>>> now()

execute now():

2015-3-25

和兩層巢狀的decorator相比,3層巢狀的效果是這樣的:

now = log(『execute』)(now)

>>> now.__name__
import functools

deflog

(func):

@functools.wraps(func)

def(*args, **kw):

print('call %s():' % func.__name__)

return func(*args, **kw)

# 或者針對帶引數的decorator:

import functools

deflog

(text):

defdecorator

(func):

@functools.wraps(func)

def(*args, **kw):

print('%s %s():' % (text, func.__name__))

return func(*args, **kw)

return decorator

Pyhton 函式式程式設計

高階函式,引數是函式的函式 返回值的函式的函式。1 引數是函式的函式 前提 變數可以指向函式,指向後變數名就覆蓋了函式名,就可以用變數名來呼叫函式。如 print abs abs abs a abs print a a a print a 5 5 def square n return n 100 ...

Pyhton學習九 函式式程式設計

加粗樣式 toc 面向過程的程式設計 基本單元,函式 函式時程式設計 允許把函式本身作為引數傳入另乙個函式,還允許返回乙個函式!abs 10 是函式呼叫,abs是函式本身 要獲得呼叫結果,我們可以把結果賦值給變數 也可以把函式本身賦給變數,即變數指向函式,這樣可以實現通過變數來呼叫函式 absin ...

Python函式式程式設計簡介

廖雪峰python函式式程式設計 函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。函式式程式設計是一種抽象程度很高的程式設計正規化。純粹的函式式程式語...