2013-07-02 92 views
15

我有一個django模型類,保持狀態爲一個簡單的屬性。我爲這個類添加了一些輔助屬性來訪問聚合狀態 - 例如is_live如果狀態是['closed', 'expired', 'deleted']等中的任何一個,則返回false習慣性蟒蛇 - 財產或方法?

由於我的模型具有is_屬性的集合,因此可以非常簡單地查找對象的內部屬性。

我現在要添加一個新屬性is_complete - 它在語義上與所有其他屬性相同 - 對對象狀態進行布爾檢查 - 但是,此檢查涉及加載依賴(一對多)子對象,檢查它們的狀態並根據結果回報 - 例如,該屬性實際上執行一些(多於一個)數據庫查詢並處理結果。

那麼,建模屬性(使用@property裝飾器)還是有效的,還是應該放棄修飾器並將其作爲方法?

使用屬性的臨是它在語義上與所有其他is_屬性一致。

使用方法的一個好處是它向其他開發人員指出這是一種更復雜的實現,因此應謹慎使用(即不在for..循環中)。

from django.db import models 

class MyModel(models.Model): 

    state = CharField(default='new') 

    @property 
    def is_open(self): 
     # this is a simple lookup, so makes sense as a property 
     return self.state in ['new', 'open', 'sent'] 

    def is_complete(self): 
     # this is a complex database activity, but semantically correct 
     related_objects = self.do_complicated_database_lookup() 
     return len(related_objects)==0 

編輯:我來自一個.NET背景原來,這裏的分裂是令人欽佩的傑夫·阿特伍德定義爲

「如果有任何機會,在所有的代碼可能催生一個沙漏,它肯定應該是一種方法。「

編輯2:輕微的更新的問題 - 這將是把它作爲一個方法的問題,所謂的is_complete,所以有混合的屬性和方法具有類似名稱的 - 或者是隻是混亂?

所以 - 它會是這個樣子:

>>> m = MyModel() 
>>> m.is_live 
True 
>>> m.is_complete() 
False 
+0

我認爲它仍然是有道理的。你可以緩存結果爲'self._is_complete'還是多次計算?你可以在後臺運行計算,還是計算只有在評估屬性時纔有效? –

+0

@JaceBrowning:我有完全一樣的想法(請參閱我的回答)。我認爲這是好的(如果沒有,它總是可以清除)。 – Tadeck

+0

@Tadeck:不用擔心。我對「django」知之甚少,不知道這個應用程序是否有意義。 –

回答

9

這是好做的,特別是如果你將使用以下模式:

class SomeClass(models.Model): 
    @property 
    def is_complete(self): 
     if not hasattr(self, '_is_complete'): 
      related_objects = self.do_complicated_database_lookup() 
      self._is_complete = len(related_objects) == 0 
     return self._is_complete 

只要記住它「高速緩存」結果,所以第一次執行計算,但隨後使用現有的結果。

+0

Thanks @tadeck - 我認爲這是一種有效的方法,但是我應該問的是,是否混合了屬性和方法(使用相同的命名約定 - 請參閱問題編輯2)? –

+0

@ HugoRodger-Brown:Pep8提到方法和實例變量都是'underscore_seperate_names',所以是的,它絕對沒問題。由於方法和變量都返回一個布爾值,所以'is_'就是我所期望的前綴。 – TyrantWave

+0

@TyrantWave:我普遍同意。此外,好的(或平均)IDE能夠判斷何時是某個屬性,方法或其他屬性,並正確顯示它。另外,我們可以期望'check_'方法不會返回任何東西(技術上說:'None'),或者接受一個回調,然後通過結果(在基於事件的方法中)。但PEP8還指出:「_項目中的一致性更重要,一個模塊或功能中的一致性是最重要的。」。所以最好有一致的圖書館,而不是遵循其他人的期望。 – Tadeck