裝飾用引數(裝飾工廠)

裝飾器只接受一個引數:要裝飾的函式。沒有辦法傳遞其他引數。

但通常需要其他論點。然後訣竅是建立一個接受任意引數並返回裝飾器的函式。

裝飾功能

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, )