如何在基类的函数上使用decorator,并在继承基类时让decorator处理该函数

2024-10-01 02:20:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个基类Example,它有一个抽象方法example。我想在example函数上添加另一个decorator,我已经在下面做过了-decorator是@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行为在ExampleSumexample函数中,而不显式地编码它


Tags: 方法函数selfoutputfooexampledefdecorator
1条回答
网友
1楼 · 发布于 2024-10-01 02:20:49

I believe the issue is that it is being 'overridden' when I create the example function on a new class.

你完全正确:修饰方法被重写。但是如果你只把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

相关问题 更多 >