1

我目前有以下使用 python 库的代码:

f = Foo(original_method, parameters)

我想增加 original_method,并让装饰器添加几行代码。我们将新的装饰方法称为decorated_method。最后我想要这样的东西:

f = Foo(decorated_method(original_method), parameters)

我的问题是:这可能吗?装饰器会是什么样子?我必须说我不能扩展 original_method,因为它是外部库的一部分。

编辑: original_method 未执行,仅作为参数传递给 Foo 。decorated_method 函数应该做一些日志记录并收集一些调用次数的统计信息。

稍后编辑:下面示例中的代码可以正常工作。我遇到了一些额外的问题,因为 original_method 有一些属性,所以这是最终代码:

def decorated_method(method):

    def _reporter(*args, **kwargs):
        addmetric('apicall', method.__name__)
        return method(*args, **kwargs)

    _reporter.original_method_attribute = method.original_method_attribute
    return _reporter
4

2 回答 2

2

你没有提到你想做decorated_method什么,但这当然是可能的:

def decorated_method(f):
    def _wrapped(*args, **kwargs):
        print "About to call f!"
        ret = f(*args, **kwargs)
        print "Just got finished with f, ret = %r" % (ret,)
        return ret
    return _wrapped

这只是标准的装饰器结构:装饰器是一个接受一个函数并返回一个函数的函数。

于 2012-07-11T11:04:50.050 回答
0

绝对地:

def decorated_method(fn):
    def inner_method(*args, **kwargs):
        print("before calling")
        result = fn(*args, **kwargs)
        print("after calling")
        return result
    return inner_method

一旦你得到这个工作,你应该看看签名保留装饰器

于 2012-07-11T11:05:48.163 回答