pyhotn3入門基礎 15 裝飾器與偏函式

2021-08-02 14:49:53 字數 1948 閱讀 4556

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

>>> def now():

print('2017-6-15')

>>> f = now

>>> f()

2017-6-15

>>> f.__name__

'now'

>>> now.__name__

'now'

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

decorator就是乙個返回函式的高階函式

def log(func):

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

return func(*args, **kw)

要借助python的@語法,把decorator置於函式的定義處:

>>> @log

def now():

print('2017-06-15')

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

>>> now()

call now():

2017-06-15

@log放到now()函式的定義處,相當於執行了語句:

now = log(now)

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

def log(text):

def decorator(func):

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

return func(*args, **kw)

return decorator

@log('execute')

def now():

print('2015-3-25')

結果:

>>> now()

execute now():

2015-3-25

效果等同於

>>> now = log('execute')(now)

>>> now.__name__

import functools

def log(func):

@functools.wraps(func)

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

return func(*args, **kw)

import functools

def log(text):

def decorator(func):

@functools.wraps(func)

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

return func(*args, **kw)

return decorator

偏函式

簡單總結functools.partial的作用就是,把乙個函式的某些引數給固定住(也就是設定預設值),返回乙個新的函式,呼叫這個新函式會更簡單。

pyhotn3入門基礎 12 迭代器

可以直接作用於for迴圈的物件統稱為可迭代物件 iterable 使用isinstance 判斷乙個物件是否是iterable物件 from collections import iterable isinstance iterable true isinstance iterable true i...

pyhotn3入門基礎 資料型別和變數

1.字串 print i m ok.i m ok.print i m learning npython.i m learning python.print n 轉義 print t print r t t 列印多行 print line1 line2 line3 line1 line2 line3 ...

python 基礎裝飾器入門

1 裝飾器語法糖 python提供了 符號作為裝飾器的語法糖,使我們更方便的應用裝飾函式。但使用語法糖要求裝飾函式必須return乙個函式物件。因此我們將上面的func函式使用內嵌函式包裹並return。裝飾器相當於執行了裝飾函式use loggin後又返回被裝飾函式bar,因此bar 被呼叫的時候...