我有一个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”知之甚少,不知道这个应用程序是否有意义。 –