Я пытаюсь добавить декоратор к абстрактному методу, чтобы при вызове метода в подклассах вызывалась также функция декоратора. Это для фреймворка, поэтому я пытаюсь ограничить количество лишнего кода, который потом пользователи должны будут кодировать. Декоратор довольно специфичен для фреймворка и не предназначен для использования обычными пользователями фреймворка - надеюсь, это имеет смысл.
Я знаю, что есть несколько других способов сделать это, но большинствоони вовлекают пользователя, копирующего некоторый шаблонный код, когда они создают свои собственные подклассы. Декоратор помогает избежать необходимости копировать шаблон.
from abc import abstractmethod, ABC
def prepost(fn):
# The new function the decorator returns
def wrapper(*args, **kwargs):
print("In wrap 1")
fn(*args, **kwargs)
print("In wrap 2")
return
wrapper.__isabstractmethod__ = True
return wrapper
class Base(ABC):
pass
class Foo(Base):
@prepost
@abstractmethod
def dosomething(self):
raise NotImplementedError
class Bar(Foo):
def dosomething(self):
print("I'm doing something")
Test = Bar()
Test.dosomething()
Когда я пытаюсь это сделать, я просто получаю: я делаю что-то
, а не дополнительный вывод из декоратора.