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()