2010-07-24 13 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