自引用几个不同的对象而不是一个

时间:2018-06-22 15:23:20

标签: python python-3.x class self apscheduler

我有一个带有创建时间表的方法的类(为简化起见,它被简化了):

def create_schedule(self):
    # Create a function-1 event
    scheduler.add_job(self.function_1,
                      trigger='date',
                      run_date=datetime_1,
                      args=[self])

    # Create a function-2 event
    scheduler.add_job(self.function_2,
                      trigger='date',
                      run_date=datetime_2,
                      args=[self])

这些是function_1function_2类的方法:

def function_1(self, *args):
    print('self in function_1:', self)

def function_2(self, *args):
    print('self in function_2:', self)

由于某种原因,当它从调度程序执行两个事件时,将显示以下内容:

self in function_1: <program.my_class object at 0x6f03e430>
self in function_2: <program.my_class object at 0x6f03e4b0>

即两者是不同的对象,因此function_1所做的更改不会出现在function_2中,反之亦然。

那是为什么? self指向的所有实例不应该都一样吗?有没有办法避免这种情况,并迫使所有self实际上指向同一实例?

1 个答案:

答案 0 :(得分:1)

您向apscheduler注册了两个不同的事件,它们在您的配置中存储了事件回调信息in a database in a serialized form

  

作业商店存放计划的作业。默认作业存储只是将作业保存在内存中,而其他作业则将其存储在各种数据库中。 作业的数据在保存到持久性作业存储中时会序列化,在从作业中加载回来时会反序列化。

强调粗体。

您拥有的两个作业是独立执行的,因此对它们进行了反序列化,从而导致从序列化数据中创建两个新实例。

您不能依靠单独的事件来对同一实例进行操作。您需要通过添加足够的标识信息来外部化状态,以便在作业触发时重新创建状态。