簡體   English   中英

在類級別使用裝飾器注冊方法

[英]Registering methods with decorator at class level

我希望能夠在課程級別注冊/返回方法。 我能找到的最接近的答案是: 使用裝飾器自動注冊類方法 ,除了它以全局寄存器為中心,我正在尋找下面的類特定的東西。

碼:

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

事實證明這與Mach_Zero的答案相似。 所以關鍵的區別,這會返回方法,而不是方法名稱,並且使用__iter__稍微簡化了get_reports()的實現。

碼:

class Reports:

    def __init__(self):
        self.reports = []

    def __call__(self, func):
        self.reports.append(func)
        return func

    def __iter__(self):
        return iter(self.reports)


class ExampleClass:

    report = Reports()

    @classmethod
    def get_reports(cls):
        # return list of all method names with @report decorator
        return list(cls.report)

    @report
    def report_x(self):
        return

    @report
    def report_y(self):
        return

    def method_z(self):
        pass

測試代碼:

print(ExampleClass.get_reports())

結果:

[
    <function ExampleClass.report_x at 0x000000000AF7B2F0>, 
    <function ExampleClass.report_y at 0x000000000AF7B378>
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM