[英]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.