从子类继承的python3装饰器方法

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章