如何在具有同一模块中定义的类内部使用修饰符?

2024-09-29 19:28:59 发布

您现在位置:Python中文网/ 问答频道 /正文

BasePlugin模块中,我定义了两个主要内容。一个名为BasePlugin的类和一个不属于名为ValidateEvent的类的修饰符。在

当我编写插件并运行时:

from BasePlugin import *

这是可行的,我可以在plugin类内的方法上使用decorator。在

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

我尝试了很多方法来引用decorator,甚至尝试将其导入到它自己的模块中,但似乎没有任何效果。我不想为decorator创建另一个模块。在

是否可以在同一个模块中定义的类中引用一个decorator,但不是该类的一部分?在

编辑:下面是一段有问题的代码

#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

Tags: 模块the方法nameselfeventnewif
1条回答
网友
1楼 · 发布于 2024-09-29 19:28:59

您的问题在于模块中定义的顺序。当您使用ValidateEvent作为BasePlugin类中某个方法的修饰符时,它需要在全局命名空间中已经可用,因为在定义方法时(不仅是在调用方法时),装饰器会立即运行。在

在您展示的代码片段中,ValidateEvent定义在类定义下面,因此Python解释器还不知道它。在

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

def ValidateEvent(func):
    ...

class BasePlugin():

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

相关问题 更多 >

    热门问题