我有一个@retry
装饰器,它是我自己定义的。
class AbstractFunction(metaclass=ABCMeta):
@abstractmethod
@retry
def run(self):
pass
现在,如果我有这样的子类,run方法会自动继承@retry
吗?
def RealFunction(AbstractFunction):
def run(self):
#the real function code
pass
AbstractFunction.run
指的是一个对象,无论retry
在被调用时返回什么。定义与基本相同
class AbstractFunction(metaclass=ABCMeta):
def run(self):
pass
run = abstractmethod(retry(run))
另一方面,RealFunction.run
指的是一个完全不相关的函数,也,名为run
。从未调用过retry
如果您想要某种继承的重试行为,请定义两个函数。AbstractFunction.run
除了调用子级需要定义的钩子之外什么也不做:
class AbstractFunction(metaclass=ABCMeta):
@retry
def run(self):
return self._run_implementation()
@abstractmethod
def _run_implementation(self):
pass
class RealFunction(AbstractFunction):
def _run_implemenation(self):
...
这里,run
既不是抽象的,也不是重写的,但确实被retry
返回的任何内容所取代。因此,当您尝试调用RealFunction().run()
时,实际上调用的是AbstractFunction.run
,它只调用RealFunction._run_implemenation
。