python3装饰器方法继承自子类


def after_finish(func):
def _decorator(*args, **kwargs):
ret = func(*args, **kwargs)
print('after finish!')
return ret
return _decorator
class AbstractTask:
@after_finish
def run(self):
raise NotImplementedError
class ConcreteTask1(AbstractTask):
def run(self):
# do concrete task here
return 0

正如上面显示的代码一样,我有一个抽象的AbstractTask类型和几个子类,我想把after_finish装饰器放在run方法中,这是一种适用于所有子类的通用行为。我怎样才能通过只放置一次装饰器来达到这个目的?或者,在python3语法中,还有其他方法可以做同样的事情吗?

您可以使用第二种方法进行

  • 您称之为run的公共
  • 您覆盖的私有:_run

如果您忘记实现方法,abstractmethod的使用可以帮助您的IDE向您发出警告

from abc import abstractmethod
def after_finish(func):
def _decorator(*args, **kwargs):
ret = func(*args, **kwargs)
print('after finish!')
return ret
return _decorator
class AbstractTask:
@after_finish
def run(self):
self._run()
@abstractmethod
def _run(self):
raise NotImplementedError
class ConcreteTask1(AbstractTask):
def _run(self):
return 0
if __name__ == '__main__':
c = ConcreteTask1()
c.run()

最新更新