2024-10-08 18:30:20 发布
网友
使用Django signalsreceiverdecorator我有以下函数。在
receiver
@receiver(post_save) def action_signal(sender, instance, created, **kwargs): pass
是否可以在类上使用receiver修饰符而不是函数?原因是我想要一个__init__方法等
__init__
也就是说,我怎样才能让这样的东西发挥作用。。。在
在类方法上使用receiver修饰符没有实际意义。您希望在什么时候实例化对象并运行__init__方法?在
您可以对connecting signals使用手动方法,而不是使用receiver修饰符。在
首先实例化对象:
action_signal = ActionSignals()
然后可以使用connect方法连接信号:
connect
您可以这样做:
class ActionSignals(object): def __init__(self, *args, **kwargs): # ... def __call__(self, *args, **kwargs): print(self.stuff)
然后连接信号处理器:
这使用了python的“magic”^{}方法,该方法允许您将类的实例用作函数。在
注意在代码中添加处理程序的位置,因为可能会创建重复项。例如,如果您要将第二位代码放在模块根目录中,它将在每次导入模块时添加一个处理程序。在
要避免这种情况,可以执行following:
post_save.connect(handler, dispatch_uid="my_unique_identifier")
正如@Alasdair所指出的,您可以在AppConfig.ready()中添加处理程序(这是推荐的执行位置),不过,如果您注意不要创建不希望的重复项,则通常可以在任何位置执行此操作。在
AppConfig.ready()
见"Where should this code live?" in this doc。在
在类方法上使用
receiver
修饰符没有实际意义。您希望在什么时候实例化对象并运行__init__
方法?在您可以对connecting signals使用手动方法,而不是使用
receiver
修饰符。在首先实例化对象:
然后可以使用
^{pr2}$connect
方法连接信号:添加基于类的信号处理程序
您可以这样做:
然后连接信号处理器:
^{pr2}$这使用了python的“magic”^{} 方法,该方法允许您将类的实例用作函数。在
避免重复
注意在代码中添加处理程序的位置,因为可能会创建重复项。例如,如果您要将第二位代码放在模块根目录中,它将在每次导入模块时添加一个处理程序。在
要避免这种情况,可以执行following:
正如@Alasdair所指出的,您可以在
AppConfig.ready()
中添加处理程序(这是推荐的执行位置),不过,如果您注意不要创建不希望的重复项,则通常可以在任何位置执行此操作。在见"Where should this code live?" in this doc。在
相关问题 更多 >
编程相关推荐