如何在Python中獲取函數(shù)的名稱
Python是一種在IT行業(yè)中廣泛使用的編程語言。在本文中,我們將學(xué)習(xí)如何在Python中獲取函數(shù)的名稱。 函數(shù)對象的__name__屬性 在Python中,函數(shù)對象具有一個特殊的屬性__name
Python是一種在IT行業(yè)中廣泛使用的編程語言。在本文中,我們將學(xué)習(xí)如何在Python中獲取函數(shù)的名稱。
函數(shù)對象的__name__屬性
在Python中,函數(shù)對象具有一個特殊的屬性__name__,可以用來獲取函數(shù)的名稱。例如:
now.__name__ 'now' f.__name__ 'now'
使用裝飾器增強函數(shù)功能
假設(shè)我們想要增強一個函數(shù)的功能,比如在函數(shù)調(diào)用前后自動打印日志,但又不希望修改函數(shù)的定義。這種在代碼運行期間動態(tài)增加功能的方式被稱為“裝飾器”(Decorator)。
裝飾器是一個返回函數(shù)的高階函數(shù)。我們可以定義一個能夠打印日志的裝飾器,如下所示:
def log(func):
def wrapper(*args, kw):
print('call %s():' % func.__name__)
return func(*args, kw)
return wrapper
使用裝飾器
通過Python的@語法,我們可以將裝飾器放置在函數(shù)的定義處:
@log
def now():
print('2013-12-25')
調(diào)用now()函數(shù)時,不僅會執(zhí)行now()函數(shù)本身,還會在函數(shù)調(diào)用前打印一行日志:
now()
裝飾器的原理
將@log放置在now()函數(shù)的定義處,相當于執(zhí)行了語句:
now log(now)
由于log()是一個裝飾器,它返回一個函數(shù)。因此,原來的now()函數(shù)仍然存在,只是現(xiàn)在同名的now變量指向了新的函數(shù)。因此,調(diào)用now()將執(zhí)行新函數(shù),即在log()函數(shù)中返回的wrapper()函數(shù)。
接收參數(shù)的裝飾器
如果裝飾器本身需要傳入?yún)?shù),那就需要編寫一個返回裝飾器的高階函數(shù)。下面是一個自定義log文本的例子:
def log(text):
def decorator(func):
def wrapper(*args, kw):
print('%s %s():' % (text, func.__name__))
return func(*args, kw)
return wrapper
return decorator
注意:調(diào)試代碼時,需要將調(diào)試代碼注釋掉。