擅长:python、mysql、java
<p>在某些情况下,使用getter函数而不使用setter函数定义属性非常有用。假设您在django中有一个如下所示的模型;模型本质上是一个数据库表,其中包含名为fields的条目。属性hostname是根据数据库中模型中的一个或多个字段计算的。这避免了数据库表中需要在每次相关字段更改时都必须更改的另一个条目。在</p>
<p>使用属性的真正好处是调用<code>object.hostname()</code>vs.<code>object.hostname</code>。后者会自动与对象一起传递,因此当我们转到类似jinja模板的地方时,我们可以调用<code>object.hostname</code>,但是调用<code>object.hostname()</code>将引发错误。在</p>
<p>下面的示例是一个带有name字段的virtualmachine模型和一个jinja代码示例,我们在其中传递了一个virtualmachine对象。在</p>
<pre><code># 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...
</code></pre>