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

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

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

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 

    One Solution collect form web for “Может ли метод быть декоратором другого метода того же класса?”

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

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

    Python - лучший язык программирования в мире.