Подтвердить что ты не робот

Может ли метод быть декоратором другого метода того же класса?

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

Итак, это похоже на то, что я хочу:

class DullRepetitiveClass:
    def __init__(self, nicevariable):
        self.nicevariable = nicevariable

    def mydecorator(self, myfunction):
        def call(*args, **kwargs):
            print "Hi! The value of nicevariable is %s"%(self.nicevariable,)
            return myfunction(*args, **kwargs)
        return call

    @mydecorator            #Here, comment (1) below.
    def somemethod(self, x):
        return x + 1

(1) Вот проблема. Я хочу использовать метод DullRepetitiveClass.mydecorator для украшения метода somemethod. Но я не знаю, как использовать этот метод из текущего экземпляра в качестве декоратора.

Есть ли простой способ сделать это?

EDIT: Хорошо, ответ довольно очевиден. Как Свен помещает его ниже, сам декоратор просто преобразует метод. Сам метод должен иметь дело со всем, что касается экземпляра:

def mydecorator(method):
    def call(self, *args, **kwargs):
        print "Hi! The value of nicevariable is %s"%(self.nicevariable,)
        return method(self, *args, **kwargs)
    return call


class DullRepetitiveClass:
    def __init__(self, nicevariable):
        self.nicevariable = nicevariable

    @mydecorator            
    def somemethod(self, x):
        return x + 1
4b9b3361

Ответ 1

Декоратор получает только один параметр - функцию или метод, которые он украшает. Он не получает экземпляр как параметр self - на данный момент, когда вызывается декоратор, даже класс не был создан, не говоря уже о экземпляре класса. Экземпляр будет передан в качестве первого аргумента декорированной функции, поэтому вы должны включить self в качестве первого параметра в списке параметров call().

Я не вижу необходимости включать декоратор в область класса. Вы можете сделать это, но вы также можете иметь его в объеме модуля.