当继承基类时,如何在基类的函数上使用装饰器并使装饰器在该函数上工作

时间:2018-08-11 14:49:35

标签: python class inheritance python-decorators

我有一个带有抽象方法Example的基类example。我想在example函数上添加另一个装饰器,这是我在下面完成的-装饰器是@foo

当我使用此基础Example类创建新类时,在其中创建适当的example函数时,@foo应该做什么,但最终没有用。

我相信问题在于,当我在新类上创建example函数时,它被“覆盖”了。

from abc import ABCMeta, abstractmethod

class Example(object):
    __metaclass__ = ABCMeta

    def __init__(self):
        self.num = 0

    @abstractmethod
    @foo
    def example(self, output):
        pass

class ExampleSum(Example):
    def example(self, output):
        self.num = self.num + output

有指导吗?基本上,我希望@foo的行为位于example的{​​{1}}函数中,而无需对其进行显式编码。

1 个答案:

答案 0 :(得分:1)

  

我认为问题在于,当我创建   新类上的示例函数。

您绝对正确:装饰方法将被覆盖。但是,如果仅对example的“内部”进行抽象,则可以实现目标:

from abc import ABCMeta, abstractmethod

class Example(object):
    __metaclass__ = ABCMeta

    def __init__(self):
        self.num = 0

    @foo
    def example(self, output):
        return self._example_impl(output)

    @abstractmethod
    def _example_impl(self, output):
        pass

class ExampleSum(Example):
    def _example_impl(self, output):
        self.num = self.num + output