首页 > 解决方案 > 如何在基类的函数上使用装饰器并在继承基类时让装饰器在该函数上工作

问题描述

我有一个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发挥作用。ExampleSum

标签: pythonclassinheritancepython-decorators

解决方案


我认为问题在于当我在新类上创建示例函数时它被“覆盖”。

你是绝对正确的:装饰方法被覆盖。但是,如果您只抽象以下的“内部部分”,您就可以实现您的目标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

推荐阅读