Зачем кому-то использовать @property, если не определены сеттер или удалитель? - PullRequest
5 голосов
/ 08 июня 2011

В коде Python я часто вижу использование свойства @.

Если я правильно понимаю, с помощью функции свойства можно определить установщик и удалитель-получатель.

Зачем использовать @property, если сеттер и удалитель не определены (@ x.setter, @ x.deleter)?Разве это не то же самое, что вообще не использовать @property?

Ответы [ 2 ]

7 голосов
/ 08 июня 2011

Создает API, который не позволяет устанавливать значение.На других языках это похоже на константу.

1 голос
/ 27 июня 2018

Определение свойства с помощью функции получения, но без установки, может быть очень полезно в определенных сценариях.Допустим, у вас есть модель, как показано ниже в Django;модель по сути является таблицей базы данных с записями, называемыми полями.Свойство hostname вычисляется из одного или нескольких полей в модели из базы данных.Это позволяет обойтись без другой записи в таблице базы данных, которая должна изменяться при каждом изменении соответствующих полей.

Истинным преимуществом использования свойства является вызов 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...
...