Я хотел бы обновить список «для всего класса» из декоратора, который украшает методы класса и добавляет каждый оформленный метод в этот список.
Вот что пришло на ум:
def add(meth: callable):
Spam.eggs.append(func)
return meth
class Spam:
eggs = []
@add
def meth(self):
pass
Это не сработает, потому что Spam
еще не завершил самоопределение при достижении @add
, и, таким образом, add
повышает NameError
, как указано в комментариях.
Я также попробовал метод класса:
class Spam:
eggs = []
@classmethod
def add(cls, meth: callable):
cls.eggs.append(meth)
return meth
@add
def meth(self):
pass
Но это тоже не работает, потому что когда достигается @add
, add
привязывается к оформленному экземпляру classmethod
, который не вызывается.
Вот что мне нужно для этого:
У меня есть класс с несколькими методами, которые принимают один аргумент (помимо self
), который преобразует этот объект таким образом, что эти методы могут быть объединены друг с другом. Я хочу украсить каждый из них таким образом, чтобы они автоматически добавлялись в список в классе.
например:.
from typing import List
def transform_meth(meth: callable):
TextProcessor.transforms.add(meth)
return meth
class TextProcessor:
transforms: List[callable] = []
@transform_meth
def m1(self, text):
return text
@transform_meth
def m2(self, text):
return text
def transform(self, text):
for transform in self.transforms:
text = transform(text)
return text
Я мог бы добавить методы в список вручную, но я нахожу, что декоратор более понятен, поскольку он близок к определению метода, и, следовательно, проще не забыть декорировать новый метод при его определении, чем добавлять его к списку вручную.