- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 Django 模型类,它将状态作为一个简单的属性来维护。我在类中添加了几个辅助属性来访问聚合状态——例如is_live
如果状态是 ['closed', 'expired', 'deleted']
等之一,则返回 false。
因此,我的模型有一组 is_ 属性,可以对对象的内部属性进行非常简单的查找。
我现在想添加一个新属性,is_complete
- 它在语义上与所有其他属性相同 - 对对象状态的 bool 检查 - 然而,此检查涉及加载依赖(一对多)子对象,检查它们的状态并根据结果进行报告 - 即此属性实际上执行一些(多个)数据库查询,并处理结果。
那么,作为属性建模(使用 @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 背景,Jeff Atwood 将拆分定义为
"if there's any chance at all that code could spawn an hourglass, it definitely should be a method."
编辑 2:对问题进行轻微更新 - 将它作为一种名为 is_complete
的方法会有问题吗,以便存在具有相似名称的混合属性和方法 - 或者仅仅是令人困惑?
所以 - 它看起来像这样:
>>> m = MyModel()
>>> m.is_live
True
>>> m.is_complete()
False
最佳答案
这样做是可以的,特别是如果您将使用以下模式:
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
请记住,它会“缓存”结果,因此第一次执行会进行计算,但随后会使用现有结果。
关于python - 惯用的 python - 属性或方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17429159/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!