gpt4 book ai didi

python - 在类级别使用装饰器注册方法

转载 作者:太空宇宙 更新时间:2023-11-03 13:58:28 25 4
gpt4 key购买 nike

我希望能够在类级别注册/返回方法。我能找到的最接近的答案在这里: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

关于python - 在类级别使用装饰器注册方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52359342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com