3 回答

TA贡献1816条经验 获得超6个赞
您可以为方法添加一个可选参数,例如:
def subop1(instance, commit=True): instance.a1 = 1 if commit: instance.save()
然后使用 调用您的实例commit=False
,然后save()
手动调用。
def main_op(instance): subop1(instance, commit=False) subop2(instance, commit=False) subop3(instance, commit=False) instance.save()

TA贡献1801条经验 获得超8个赞
方法一:
实例是相同的,所以你可以这样做:
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
你可以这样做,因为 instance 是一个对象,它是通过引用而不是通过值传递的。
因此,如果您在函数中编辑实例,更改也会保留在该方法之外
方法二:
或者你可以做这样的事情:
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 在这种情况下,您的物品将在您丢弃时得到保存。所以如果你不主动保存对象,它无论如何都会被保存。
所以最终最好的方法是在数据库上做更多的事务。

TA贡献1827条经验 获得超8个赞
您可以通过以下方式进行。
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()
添加回答
举报