如何在具有相同模块中的定义的类中使用装饰器?

时间:2018-02-08 01:56:26

标签: python python-3.x python-decorators

BasePlugin模块中,我定义了两个主要内容。一个名为BasePlugin的类,以及一个不属于类ValidateEvent的类的装饰器。

当我写一个插件并运行时:

from BasePlugin import *

这可行,我可以在插件类中的方法上使用装饰器。

但是,如果我尝试在BasePlugin类中修饰一个方法,它就找不到装饰器。

我尝试了很多方法来引用装饰器,甚至试图将它导入到它自己的模块中,但似乎没有任何工作。我宁愿不为装饰者创建另一个模块。

是否可以引用在同一模块中定义但不作为类的一部分定义的类中的装饰器?

编辑:以下是违规代码的片段

#BasePlugin.py
class BasePlugin():

   def __init__(self, event_manager):
      pass

   @ValidateEvent
   def ProvideModeEventHandler(self, event):
      self._mode = event.Message

def ValidateEvent(func):
   """
   Decorator used to check if the event(s) fired should be
   handled by the plugin.
   """
   def new_func(plugin, event, *args, **kwargs):
      if plugin.Name == event.Name or event.Name == '':
         return func(plugin, event, *args, **kwargs)
   return new_func

1 个答案:

答案 0 :(得分:2)

您遇到的问题是模块中定义的顺序。当您在ValidateEvent类中的方法上使用BasePlugin作为装饰器时,它必须已在全局命名空间中可用,因为装饰器在定义方法时立即运行(不仅在方法时被称为。)

在您已经显示的代码片段中,ValidateEvent定义在类定义下方,因此Python解释器尚未了解它。

要解决此问题,请将装饰器的定义移到类定义之上:

def ValidateEvent(func):
    ...

class BasePlugin():

   @ValidateEvent
   def ProvideModeEventHandler(self, event):
       ...