【发布时间】:2014-01-05 20:15:19
【问题描述】:
我有一个 @on_event 装饰器,它将函数注册为指定事件的回调:
@on_event('MY_EVENT')
def on_event_triggers(*a, **k):
print('Event triggered')
但是,我希望我的装饰器能够处理“全局”函数(如上)和类函数:
class MyModule(Module):
@on_event('MY_EVENT')
def on_event_triggered(self, *a, **k):
print('Event triggered in a method')
当然,self 参数将被正确传递(并由我未在此处显示的某些代码确定)。但是,要使其正常工作,我必须能够知道传递给我的装饰器的函数是方法还是全局函数。
我正在使用 Python 3.3。
【问题讨论】:
-
为什么必须区分它们才能使两者都起作用?大多数装饰器应该简单地传递所有参数并且不需要检查任何参数,因此可以像任何其他函数一样装饰方法。
-
你不能,因为在你的装饰器被调用的时候,这个类还不存在,所以函数不知道它会变成一个方法。为什么装饰者需要知道这一点?
-
因为在第二种情况下我必须为“self”传递一个值,而在第一种情况下我没有。 @on_event 装饰器将保留事件触发时要调用的方法列表,因此当我调用这些方法时,我必须传递“self”或不传递。
-
@ThibautD.: 如果你传递了
*args和**kwargs,self 会自动传递,因为它只是一个普通的参数。 -
@ThibuatD:请编辑您的问题,以提供有关您如何使用此代码以及您希望如何确定 self 值的更多详细信息。
on_event到底应该做什么,什么时候应该做?
标签: python