首页 > 解决方案 > 在类级别使用装饰器注册方法

问题描述

我希望能够在类级别注册/返回方法。我能找到的最接近的答案在这里: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_'在这种情况下不起作用。

标签: pythonpython-3.xmetaprogrammingdecorator

解决方案


您可以像这样声明 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

推荐阅读