将装饰器添加到库中的方法 class

Add decorator to method from library class

我有一个无法更改的 class(它来自图书馆),它可能看起来像

class Test(object):
    def __init__(self):
        pass

    def bar(self, x):
        return x

并且我想在Test中的bar方法中添加一个装饰器,如下所示,例如:

from functools import wraps

def some_decorator(fn):
    @wraps(fn)
    def wrapped(*args, **kwargs):
        return "<b>" + fn(*args, **kwargs) + "</b>"
    return wrapped

通过“添加”装饰器,我的意思是有一种方法可以生成将 bar 方法包装在 some_decorator 中的对象。

但是,我无法更改 Test 中的代码,这使我的问题变得更加困难。有没有一种简单的方法可以在我无法在 python 中更改的 class 方法中添加装饰器?

你可能知道装饰器只是一个函数,它接受一个函数作为参数和 returns 一个新函数,因此你可以按照 nasty-hacky monkeypatching:

import your_library
your_library.Test.your_function = your_decorator(your_library.Test.your_function)

如果你不想修改原来的 class 定义,那么你可以通过简单的继承本身来实现这一点,而不是使用装饰器..

class Test(object):
    def __init__(self):
        pass

    def bar(self, x):
        print("In base bar..")
        return x

class DerivedTest(Test):
    def __init__(self):
        super().__init__()

    def bar(self,x):
        print("In derive's bar..")
        super().bar(x)

现在执行时说:

dt=DerivedTest()
dt.bar(10)

输出将是

In derive's bar..
In base bar..

您可以在 super() 调用前后放置您想要的任何包装代码..