我有一個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
我認爲它仍然是有道理的。你可以緩存結果爲'self._is_complete'還是多次計算?你可以在後臺運行計算,還是計算只有在評估屬性時纔有效? –
@JaceBrowning:我有完全一樣的想法(請參閱我的回答)。我認爲這是好的(如果沒有,它總是可以清除)。 – Tadeck
@Tadeck:不用擔心。我對「django」知之甚少,不知道這個應用程序是否有意義。 –