如果没有定义setter或deleteter,为什么有人会使用@property?

时间:2011-06-08 06:46:28

标签: python properties decorator

在python代码中,我经常看到@property的使用。

如果我理解正确,使用property function可以定义一个getter setter和deleter。

如果未定义setter和deleter(@ x.setter,@ x.deleter),为什么会使用@property?是不是完全没有使用@property?

2 个答案:

答案 0 :(得分:7)

它创建了一个不允许设置值的API。这在其他语言中类似于常量。

答案 1 :(得分:1)

在某些情况下,使用getter函数但不使用setter定义属性可能非常有用。假设您在Django中具有以下模型;模型本质上是一个数据库表,其中包含称为字段的条目。属性主机名是根据数据库中模型中的一个或多个字段计算得出的。这样可以避免每次更改相关字段时都必须更改数据库表中的另一个条目。

使用属性的真正好处是调用object.hostname()object.hostname。后者会随对象一起自动传递,因此当我们进入类似jinja模板的地方时,可以调用object.hostname,但是调用object.hostname()会引发错误。

下面的示例是一个带有名称字段的虚拟机模型,以及一个传递虚拟机对象的Jinja代码示例。

# 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...