装饰器作为类

2024-03-29 04:55:30 发布

您现在位置:Python中文网/ 问答频道 /正文

试图将装饰程序重写为Class并没有按预期工作。我真正的装饰师是:

def check(callback):
    def decorator(function):
        def wrapper(*args, **kwargs):
            result = function(*args, **kwargs)
            cb_result = callback()
            return result 
        return wrapper
    return decorator

我对课堂形式的看法是

class Check(object):
    def __init__(self, *args, **kwargs):
        self._args = args
        self._kwargs = kwargs

    def __call__(self, *call_args, **call_kwargs):
        function = call_args[0]
        return self.__param__call__(function)

    def __param__call__(self, function):
        def wrapper(*args, **kwargs):
            result = function(*args, **kwargs)
            cb_result = callback()
            return result 
        return wrapper

我希望使用装饰器:

@Check(callback=a_function_callback)
def my_function():
    ...

当我把它重写为一个类时,我的错误是什么?我还一直在努力保持向后兼容性(又称python2.7兼容性)


Tags: selfreturnparamdefcheckcallbackargsfunction
1条回答
网友
1楼 · 发布于 2024-03-29 04:55:30

您应该接受callback作为Check__init__方法中的参数,这样wrapper函数就可以实际引用它作为回调函数:

class Check(object):
    def __init__(self, callback):
        self.callback = callback

    def __call__(self, func):
        return self.__param__call__(func)

    def __param__call__(self, func):
        def wrapper(*args, **kwargs):
            result = func(*args, **kwargs)
            cb_result = self.callback()
            return result 
        return wrapper

相关问题 更多 >