裝飾用引數(裝飾工廠)
裝飾器只接受一個引數:要裝飾的函式。沒有辦法傳遞其他引數。
但通常需要其他論點。然後訣竅是建立一個接受任意引數並返回裝飾器的函式。
裝飾功能
def decoratorfactory(message):
def decorator(func):
def wrapped_func(*args, **kwargs):
print('The decorator wants to tell you: {}'.format(message))
return func(*args, **kwargs)
return wrapped_func
return decorator
@decoratorfactory('Hello World')
def test():
pass
test()
裝飾器想告訴你:Hello World
重要的提示:
有了這樣的裝飾工廠,你必須用一對括號呼叫裝飾器:
@decoratorfactory # Without parentheses
def test():
pass
test()
TypeError:
decorator()
缺少 1 個必需的位置引數:‘func’
裝飾器類
def decoratorfactory(*decorator_args, **decorator_kwargs):
class Decorator(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print('Inside the decorator with arguments {}'.format(decorator_args))
return self.func(*args, **kwargs)
return Decorator
@decoratorfactory(10)
def test():
pass
test()
帶引數的裝飾器裡面(10, )