python - 如何在基类的函数上使用装饰器并在继承基类时让装饰器在该函数上工作
问题描述
我有一个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
解决方案
我认为问题在于当我在新类上创建示例函数时它被“覆盖”。
你是绝对正确的:装饰方法被覆盖。但是,如果您只抽象以下的“内部部分”,您就可以实现您的目标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
推荐阅读
- docker - 如何在 Zalenium 中处理并行测试运行
- python - 如何在 tkinter 中按顺序打印列表框选择?
- asp.net-mvc-5 - 为什么 MS Identity Platform 回调有两个重定向 URI,一个是 302,一个是 304?
- node.js - 为什么“npm run lint”指向父文件夹中的 .eslintrc 不是当前的?
- sql-server - SSIS Access DB - 执行 SQL 过程时多步 OLE DB 操作产生错误
- html - 如何查找围绕 SVG 的偏移路径的数据
元素 - swift - Swift:运行时错误仅在发布模式下崩溃
- php - 使用 PHP cURL 发送 ssl 证书“.cer”文件
- discord.py - 我正在尝试使用 discord.py 集成,但每次都会出错
- aws-iot - 无法以批处理模式将 aws iot mqtt 消息发送到 aws kinesis firehose