2024-05-14 23:41:21 发布
网友
在python代码中,我经常看到@property的用法。
如果我理解正确,使用property function可以定义getter setter和deleter。
如果setter和deleter没有定义(@x.setter,@x.deleter),为什么要使用@property?这不等于根本不使用@property吗?
它创建了一个不允许设置值的API。这在其他语言中类似于常量。在
在某些情况下,使用getter函数而不使用setter函数定义属性非常有用。假设您在django中有一个如下所示的模型;模型本质上是一个数据库表,其中包含名为fields的条目。属性hostname是根据数据库中模型中的一个或多个字段计算的。这避免了数据库表中需要在每次相关字段更改时都必须更改的另一个条目。在
使用属性的真正好处是调用object.hostname()vs.object.hostname。后者会自动与对象一起传递,因此当我们转到类似jinja模板的地方时,我们可以调用object.hostname,但是调用object.hostname()将引发错误。在
object.hostname()
object.hostname
下面的示例是一个带有name字段的virtualmachine模型和一个jinja代码示例,我们在其中传递了一个virtualmachine对象。在
# PYTHON CODE class VirtualMachine(models.Model): name = models.CharField(max_length=128, unique=True) @property def hostname(self): return "{}-{}.{}".format( gethostname().split('.')[0], self.name, settings.EFFICIENT_DOMAIN ) # JINJA CODE ...start HTML... Name: {{ object.name }} # fails Hostname: {{ object.hostname() }} # passes Hostname: {{ object.hostname }} ...end HTML...
它创建了一个不允许设置值的API。这在其他语言中类似于常量。在
在某些情况下,使用getter函数而不使用setter函数定义属性非常有用。假设您在django中有一个如下所示的模型;模型本质上是一个数据库表,其中包含名为fields的条目。属性hostname是根据数据库中模型中的一个或多个字段计算的。这避免了数据库表中需要在每次相关字段更改时都必须更改的另一个条目。在
使用属性的真正好处是调用
object.hostname()
vs.object.hostname
。后者会自动与对象一起传递,因此当我们转到类似jinja模板的地方时,我们可以调用object.hostname
,但是调用object.hostname()
将引发错误。在下面的示例是一个带有name字段的virtualmachine模型和一个jinja代码示例,我们在其中传递了一个virtualmachine对象。在
相关问题 更多 >
编程相关推荐