我有一个带有抽象方法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}}函数中,而无需对其进行显式编码。
答案 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