[英]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.