【问题标题】:In a function decorator, how can I know if the function is a class method or not? [duplicate]在函数装饰器中,我如何知道函数是否是类方法? [复制]
【发布时间】: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


【解决方案1】:

您应该提供两种装饰器,一种用于免费功能,一种用于方法。没有简单或可靠的方法可以从装饰器内部找到一个与另一个区分开来。不过,这对于编写代码的人来说是微不足道的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 2013-09-07
    • 2020-11-14
    相关资源
    最近更新 更多