2010-07-24 65 views
2
class A(object): 
    def __init__(self): 
     self.db = create_db_object() 

    def change_Db_a(self): 
     self.db.change_something() 
     self.db.save() 

    def change_db_b(self): 
     self.db.change_anotherthing() 
     self.db.save() 

我从数据库中获取对象,我将其更改为多个函数并将其保存回来。这是因为它在每次函数调用时都碰到数据库,所以速度很慢。有没有什么像解构器,我可以保存数据库对象,这样我就不必为每个函数调用保存它,而不会浪费时间。python:跟踪类的变化,将其保存在结尾

回答

3

不要依赖__del__方法来保存对象。有关详细信息,请参阅此blog post

您可以通过定义__enter____exit__方法使用使用context management protocol

class A(object): 
    def __enter__(self): 
     print 'enter' 
     # create database object here (or in __init__) 
     pass 

    def __exit__(self, exc_type, exc_val, exc_tb): 
     print 'exit' 
     # save database object here 

    # other methods 

然后使用with语句,当你创建你的对象:当你进入with

with A() as myobj: 
    print 'inside with block' 
    myobj.do_something() 

中,将调用A.__enter__方法。当您退出with区块时,将会调用__exit__方法。例如,对于上面的代码中,你应该看到下面的输出:

enter

inside with block

exit

下面是对with语句的详细信息:

+0

它给我错误,AttributeError:'A'对象没有属性'db' – iamgopal 2010-07-24 08:43:58

+0

很难说,因为我看不到你的代码(上面写的代码中没有'db')。但是你确定你初始化了'db'变量吗?你错过了“自我”吗?听起来像是一个不同的问题,所以也许你应该开始一个新的问题,并发布一些代码。 – ars 2010-07-24 08:51:49

1

您可以定义一个del方法。

def __del__(self): 
    self.db.save() 

但请注意,这违反了数据一致性。

+0

感谢。这就是我想要的。还有一个问题:如何检测db中的变化?所以,如果没有改变,我不会不必要地将对象保存到每个del的数据库中。 – iamgopal 2010-07-24 08:14:17

+0

你可以在你的类中重载'__setattr__'并在其调用中设置标志。然后在'__del__'处检查该标志。 – 2010-07-24 08:22:05