【问题标题】:Decorators as classes装饰器作为类
【发布时间】:2019-02-20 22:40:33
【问题描述】:

尝试将装饰器重写为 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():
    ...

在将它重写为一个类时我的错误是什么,我也一直在努力保持向后兼容性(也就是 Python 2.7 合规性)。

【问题讨论】:

    标签: python class python-decorators


    【解决方案1】:

    您应该在您的Check 类的__init__ 方法中接受callback 作为参数,以便您的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
    

    【讨论】:

      猜你喜欢
      • 2021-07-16
      • 2014-02-18
      • 2019-01-01
      • 1970-01-01
      • 2016-10-14
      • 2011-09-30
      • 2020-03-26
      • 1970-01-01
      • 2020-10-04
      相关资源
      最近更新 更多