通常在實際應(yīng)用中有人寫的框架中包含了一個回調(diào)函數(shù),需要我們傳入一個函數(shù)作為參數(shù)(這種方式不是面向切面的編程,這個我們暫且不論框架設(shè)計的問題),回調(diào)函數(shù)是不帶參數(shù)的,但我們開發(fā)的函數(shù)由于復(fù)用的需要設(shè)計了函數(shù)參數(shù),那么問題來了,如何把我們設(shè)計的函數(shù)傳給框架中作為回調(diào)呢?
框架代碼如下:
class Framework:
def __init__(self, callback):
self.callback = callback
def run(self):
self.setup()
# 框架中并未對回調(diào)函數(shù)傳參數(shù)
self.callback()
self.teardown()
def setup(self):
pass
def teardown(self):
pass
我們設(shè)計的函數(shù)是帶參數(shù)的,比如
def your_function(level, message):
print(level, message)
這樣我們需要為重新定義函數(shù)來滿足框架中的回調(diào)嗎?怎么做?
- 使用閉包
# 方法一 使用閉包
def configured_wrapper_logger(level, message):
def _configured_logger():
your_function(level, message)
return _configured_logger
- 使用lambda
# 方法二,使用lambda
configured_lambda_logger = lambda: your_function(logging.ERROR, "ERROR logger")
- 使用class的call
# 方法三 使用class __call__
class ConfiguredLogger:
def __init__(self, level, msg):
self.level = level
self.msg = msg
def __call__(self):
your_function(self.level, self.msg)
這三種方式都可以復(fù)用自定義函數(shù)的前提下,方便的傳遞給框架