从库类向方法添加装饰器

2024-04-16 08:04:21 发布

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

我有一个我无法更改的类(它来自一个库),它可能看起来像

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

    def bar(self, x):
        return x

我想在Test中的bar方法中添加一个decorator,例如如下所示:

from functools import wraps

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

通过“添加”decorator,我的意思是有一种方法来生成具有bar方法包装在some_decorator中的对象

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


Tags: 方法testselfreturnobjectdefbarargs
2条回答

您可能知道,decorator只是一个函数,它接受一个函数作为参数并返回一个新函数,因此您可以执行以下令人讨厌的恶意修补程序:

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

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

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()调用之前和之后放置您想要的任何包装器代码

相关问题 更多 >