Метод 1:
Экземпляр такой же, поэтому вы можете сделать это:
def subop1(instance):
instance.a1 = 1
def subop1(instance):
instance.a2 = 2
def subop1(instance):
instance.a3 = 3
def main_op(instance):
subop1(instance)
subop2(instance)
subop3(instance)
instance.save() # triggers 1 DB request
Вы можете сделать это, потому что экземпляр является объектом, и этопередается по ссылке, а не по значению.
Таким образом, если вы редактируете экземпляр в функции, изменения также остаются вне этого метода
Метод 2:
Или вы можете сделать что-то вроде этого:
from threading import Timer
class Object():
a1 = 0
a2 = 0
a3 = 0
def save(self):
print(self.a1)
print(self.a2)
print(self.a3)
def subop1(instance):
instance.a1 = 1
restart_timer(instance)
def subop2(instance):
instance.a2 = 2
restart_timer(instance)
def subop3(instance):
instance.a3 = 3
restart_timer(instance)
def main_op(instance):
subop1(instance)
subop2(instance)
subop3(instance)
timer = None
def restart_timer(instance):
global timer
if timer != None:
timer.cancel() # this delete last timer
timer = Timer(5.0, Object.save, [instance]) # This call the save method after 5 sec
timer.start() # This start the new timer
if __name__ == '__main__':
obj = Object()
main_op(obj)
Обратите внимание однако, это не лучший способ сделать это, потому что сборщик мусора может устранить экземпляр, поэтому используйте этометод, только если вы уверены, что объект будет оставаться глобальным все время.
В противном случае вы должны добавить этот метод к классу объекта.
def __exit__(self, exc_type, exc_value, traceback):
self.save()
Обратите внимание, pt.2 В этом случае ваш предмет будет сохранен при каждом его удалении.Поэтому, если вы не сохраните объект добровольно, он все равно будет сохранен.
Таким образом, лучший способ в конечном итоге - выполнить больше транзакций в базе данных.