@Lepeshka

Как написать такой декоратор?

Есть класс. В нём есть методы. Как написать декоратор методов в классе таким образом, чтобы он добавлял имена этих методов в словарь, который является полем этого класса?

class A(object):
    mydict = dict()
   
    @decorator
    def method1(self):
        pass
    
    @decorator
    def method2(self):
        pass
  • Вопрос задан
  • 177 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Именно так, как написано в ОП посте - боюсь, что нельзя.
Но есть варианты.
1. Передавать в декоратор параметр - словарь, куда будут складываться методы. Так сделано в комменте П. Ерошевича.
2. Использовать пару декораторов, один для методов, другой для класса. Первый ставит некоторую метку на методы (нестандартный атрибут), второй проверяет __dict__ класса и складывает в словарь методы с этим атрибутом.
Например:
def methoddecorator(method):
  setattr(method, 'super_secret_attribute', True) #ставим метку на метод
  return method

def classdecorator(cls):
  methods = dict()
  for name, obj in cls.__dict__.items():
    #ищем вызываемые объекты с меткой. Можно уточнить, конечно.
    if callable(obj) and getattr(obj, 'super_secret_attribute', None) is True:
      delattr(obj, 'super_secret_attribute') #удаляем метку
      methods[name] = obj #запоминаем метод
  setattr(cls, 'methods', methods) #записываем словарь меченых методов в поле класса
  return cls

@classdecorator
class Cls:
  #этот метод попадёт в Cls.methods
  @methoddecorator
  def method1(self):
    pass

  #этот метод НЕ попадёт в Cls.methods
  def method2(self):
    pass
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы