2011-10-11 45 views
0

我遇到以下問題。我在MVC中有一個模型類,它有一個特殊的目的。在某些情況下,它應該能夠覆蓋自己。這種行爲可能嗎?Python,自我過濾

Class Text(Document): 
    a = StringField() 
    b = StringField() 

    def save(self): 
     if 1==Text.object(a=self.a).count():  # if similar object exists in db, 
      self = Text.object(a=self.a).first() # get the instance from db and 
                # override the origian class. 
     else:          #use super class' save-function 
      return super(Text, self).save() 
+0

即使有辦法做到這一點,那麼從現在開始的6個月內,您真的想保持和理解嗎?而不是 - 創建對象 - 詢問數據庫是否存在類似的對象 - 替換對象爲什麼你不問 - 向數據庫詢問它是否具有一些給定屬性的對象 - 如果是,則獲取它,否則創建它? –

+0

這將使編碼更容易。由於低級數據庫模型正在照顧所有的保存功能。 –

回答

0

是有可能:-)

嚴重的是,使用到super條件調用在你的榜樣將實現的結果。

但是,您示例的風格有點令人困惑,而更改它可能會讓您更輕鬆地實現整體目標。 (但是,這些都不直接影響到你的問題。)

  1. 我不會建議把一個方法在你的類名爲object除非我沒有別的選擇。
  2. 您在方法Text.save內通過self.aText.object的事實看起來不正確。只需簡單地撥打self.object()並使用方法object直接在其代碼中使用self.a將會更清潔。
+0

它看起來像Django代碼,用於查找某個對象的'a == self.a' –

+0

'self = Text.object(a = self.a).first()'沒有做他想做的事。它只是指向該對象的'self'對於該方法call_的其餘部分,它不會更改其他作用域中的對象 - 它不會「覆蓋原始類」。他只有在「db」中沒有「類似對象」的情況下才會調用super,這與「self」的重新賦值無關。 – agf

+0

任何想法如何用將要從數據庫中獲取的對象替換原始對象?我也注意到,獲取對象並將其置於自我狀態不起作用。 –

1

有沒有無足輕重的方法讓對象成爲 python中的另一個對象。分配到self不會這樣做; self是方法定義中的局部變量,賦值給它不會以任何方式更改現有實例;只會使該方法的其餘部分無法訪問。

有幾種方法可以解決這個問題。首選的方法是有一個方法返回正確的實例。

class Foo(...): 
    def get_or_save(self): 
     existing = load_from_database(self.bar) 
     if existing is not None: 
      return existing 
     else: 
      save_to_database(self) 
      return self 

new_inst = Text() 
new_inst.bar = "baz" 

inst = new_inst.get_or_save() 
# stop using new_inst 

還有一種駭人聽聞的方式可以得到與原始示例類似的效果。普通的Python類將其大多數屬性存儲在特殊的__dict__屬性中。你可以複製它,它會像一個實例被另一個實例替換。當然,這隻適用於完全普通的python類,並且可能或不可能在ORM中定義的類或者以更聰明的方式保留狀態的類。

class Foo(...): 
    def save(self): 
     existing = load_from_database(self.bar) 
     if existing is not None: 
      self.__dict__ = existing.__dict__ 
     else: 
      save_to_database(self) 
+0

這個作品很有魅力。謝了哥們:) –