转换装饰器将一个实例方法转换为类函数

2024-04-26 17:38:27 发布

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

我需要将几个方法作为回调传递,它们不接受self参数。我当前的代码是这样的:

def _do_callback(callback, log, *args):
    try:
        # some common code
        callback(*args)
    except:
        log.error('XX')

class Foo(object):
    def __init__(self):
        self.log = Log('Foo')
        self.cb1_wrapper = lambda x: _do_callback(self.cb1, self.log, x)  # I need a function taking one parameter
        self.cb2_wrapper = lambda x: _do_callback(self.cb2, self.log, x)

    def cb1(self, x):
        # some code accessing self

    def cb2(self, x):
        # some code accessing self

    def register_callbacks(self):
        register('1', self.cb1_wrapper)
        register('2', self.cb2_wrapper)

是否可以编写一些修饰符应用于cb1和{},以便将结果传递到当前使用self.cb1_wrapper的代码中?在

(我知道标题不理想,请随意编辑)


Tags: lambda代码selfregisterlogfoodefcallback
2条回答

我不知道decorator,但您可以很容易地编写一个“wrapper function”,它将一个绑定方法到“callback”。像这样的东西:

def wrap(bound_method):
    return lambda x: _do_callback(bound_method, bound_method.__self__.log, x)

那个(少校?)缺点是您必须在调用时使用包装:

^{pr2}$

当然;只要想想展开的方法应该是什么样子:

def callback(fn):
    def inner(self, *args):
        return _do_callback(fn.__get__(self, type(self)), self.log, *args)
    return inner

class Foo(object):
    def __init__(self):
        self.log = Log('Foo')

    @callback
    def cb1_wrapped(self, x):
        pass

相关问题 更多 >