Skip to main content
 首页 » 编程设计

python之Django 信号接收器接受 self 参数

2025年05月04日42飞鱼

我在做游戏。每次发生特定 Action 时,它都会发送一个信号。该信号被许多不同的对象使用。例如,玩家模型实例会恢复一点生命值,灯笼会减少剩余的油量。我希望这些模型的实例在发出信号时使用react并修改它们的数据。但是,我不知道如何在接收函数中引用实例本身,因为我不能将“self”放入函数使用的参数列表中。

class Lantern(models.Model): 
    oil_left= models.IntegerField(default=4) 
 
    @receiver(mySignal) 
    def burn(sender, **kwargs): 
        self.oil_left  -= 1 #<- self is not defined obviously 
        self.save() #<- self is not defined obviously 

为什么将接收者作为实例方法?因为在发送信号时,对信号使用react的实例列表是未知的。信号只是一个 ping 通知感兴趣的对象(即使用接收器方法)事件发生了,因此它们可以触发自己的特定行为。

请您参考如下方法:

为什么要让信号成为实例方法?似乎没有任何理由。您只需要确保当您编写信号函数本身时,它会传递相关实例 - 例如作为 instance kwarg - 与内置的 pre-save 完全一样post-save 信号会。

在编辑问题后添加 但这正是信号应该如何工作的。有一个单一的信号函数,它发送信号连同任何关联信息,以及任意数量的收听信号的接收器。但是接收器本身不与特定实例相关联 - 它们不可能,一个实例仅在您实际实例化它时才存在(!),否则它只是数据库中的一行。

也许您的接收器函数可以查询相关对象本身,并在那里更新它们 - 或者更好的是,执行 update 查询以就地更改它们。