python3 装饰器方法继承自 child class

python3 decorator method inherited from child class

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类型,还有几个子class,我想把after_finish装饰器放到run方法,这是适用于所有子 classes 的一般行为。我怎样才能通过只放置一次装饰器来达到这个目的呢?或者在 python3 语法中是否有任何其他方法可以做同样的事情?

您可以使用第二种方法

  • public 你称之为: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()