【问题标题】:python3 decorator method inherited from child class从子类继承的python3装饰器方法
【发布时间】:2021-02-21 17:26:07
【问题描述】:
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 语法中做同样的事情?

【问题讨论】:

    标签: python python-3.x python-decorators


    【解决方案1】:

    你可以用第二种方法来拥有

    • 您拨打的公众号: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()
    

    【讨论】:

      猜你喜欢
      • 2019-11-27
      • 2021-02-12
      • 2014-09-06
      • 2012-11-14
      • 2011-11-20
      • 2019-07-27
      • 2018-01-16
      • 2019-06-10
      • 2019-10-02
      相关资源
      最近更新 更多