Добавить декоратор в метод из библиотечного класса - PullRequest
0 голосов
/ 04 августа 2020

У меня есть класс, который я не могу изменить (он взят из библиотеки), который может выглядеть как

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

    def bar(self, x):
        return x

И я хочу добавить декоратор к методу bar в Test, как, например, следующее:

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?

Ответы [ 2 ]

3 голосов
/ 04 августа 2020

Как вы, вероятно, знаете, декоратор - это просто функция, которая принимает функцию в качестве аргумента и возвращает новую функцию, поэтому вы можете выполнить следующую мерзкую хитрость обезьяны:

import your_library
your_library.Test.your_function = your_decorator(your_library.Test.your_function)
2 голосов
/ 04 августа 2020

Если вы не хотите изменять исходное определение класса, вы можете добиться этого с помощью простого наследования вместо использования декораторов ..

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 () ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...