python - 在类级别使用装饰器注册方法
问题描述
我希望能够在类级别注册/返回方法。我能找到的最接近的答案在这里:Auto-register class methods using decorator,除了它以全局寄存器为中心,我正在寻找特定于下面的类的东西。
代码:
class ExampleClass:
def get_reports(self):
# return list of all method names with @report decorator
pass
def report(self):
# decorator here
pass
@report
def report_x(self):
return
@report
def report_y(self):
return
def method_z(self):
pass
我想ExampleClass.get_reports()
返回的地方['report_x', 'report_y']
。
并非所有报告都以report_
开头,因此可能无法仅查看方法名称。我试图弄清楚如何做到这一点以适用于各种情况,因此仅寻找'report_'
在这种情况下不起作用。
解决方案
您可以像这样声明 Reporter 类并将实例用作类属性。我使用__call__
覆盖来缩短装饰器,但您可以将函数report
和装饰方法命名为@report.report
class Reporter:
def __init__(self):
# Maintain a set of reported methods
self._reported = set()
def __call__(self, fn, *args, **kwargs):
# Register method
self._reported.add(fn.__name__)
def decorate(*args, **kwargs):
return fn(*args, **kwargs)
return decorate
class ExampleClass:
report = Reporter()
def get_reports(self):
# return list of all method names with @report decorator
return list(self.report._reported)
@report
def report_x(self):
return
@report
def report_y(self):
return
def method_z(self):
pass
推荐阅读
- php - 如何在 PHPWord 中使边框不“细”以防止 Adobe Reader 中“增强细线”设置的行为
- api-gateway - 最小化/消除 OCI API GW 授权的初始 FN 启动延迟
- c++ - 在多线程中运行的同一对象的多个实例,我如何防止所有线程更改全局变量?
- typescript - 'extends'关键字在联合上的奇怪行为
- google-cloud-platform - Cloud SQL 联合查询 - 私有数据库
- wpf - 如何在编译时自动包含资源文件的副本而不嵌入它们?
- c++ - 使用只有一个参数的构造函数将两个数字相加
- google-cloud-platform - gcloud VM - 无法访问此站点
- django - Django all-auth 仅在验证用户电子邮件地址后才允许用户登录
- qt - 如何在 Qt Designer 中自动调整子元素的大小?