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

2024-05-14 23:41:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

如果setter和deleter没有定义(@x.setter,@x.deleter),为什么要使用@property?这不等于根本不使用@property吗?


Tags: 代码用法定义functionpropertysettergetterdeleter
2条回答

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

在某些情况下,使用getter函数而不使用setter函数定义属性非常有用。假设您在django中有一个如下所示的模型;模型本质上是一个数据库表,其中包含名为fields的条目。属性hostname是根据数据库中模型中的一个或多个字段计算的。这避免了数据库表中需要在每次相关字段更改时都必须更改的另一个条目。在

使用属性的真正好处是调用object.hostname()vs.object.hostname。后者会自动与对象一起传递,因此当我们转到类似jinja模板的地方时,我们可以调用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...

相关问题 更多 >

    热门问题