子类方法会自动继承超类中抽象方法的decorator吗



我有一个@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

最新更新