繁体   English   中英

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

[英]How can I use a decorator inside a class with the definition in the same module?

BasePlugin模块内部,我定义了2个主要内容。 一个名为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

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

在显示的代码片段中, ValidateEvent是在类定义下方定义的,因此Python解释器尚不知道。

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

def ValidateEvent(func):
    ...

class BasePlugin():

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM