Могу ли я динамически изменить (патч обезьяны) существующий метод класса python, чтобы добавить декоратор

Допустим, у меня есть существующий класс Python 2.7:

class TestClass(object):
    def foo1(self):
        return self.foo2()

    def foo2(self):
        return self.foo3()

    def foo3(self):
        return 'Hello World!'

Есть ли способ во время выполнения динамически добавить (обезьяний патч) декоратор (@testdecorator) к каждому из трех существующих методов, foo1, foo2 и foo3?

Заранее спасибо за любые предложения!


person mba12    schedule 08.03.2016    source источник
comment
Также может быть полезно для вас: stackoverflow.com/questions/6098073/   -  person Torxed    schedule 08.03.2016


Ответы (2)


Это звучит ужасно, но это вполне возможно. @decorator — это просто синтаксический сахар; вы можете сделать это длинным путем:

TestClass.foo1 = testdecorator(TestClass.foo1)
person Daniel Roseman    schedule 08.03.2016

Да:

TestClass.foo1 = testdecorator(TestClass.foo1)

И так далее.

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

person kindall    schedule 08.03.2016