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