gpt4 book ai didi

python - 惯用的 python - 属性或方法?

转载 作者:太空狗 更新时间:2023-10-29 17:07:47 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com