Объекты класса содержат как _, так и атрибуты при использовании декоратора свойств

#python #oop #properties #python-decorators #python-class

Вопрос:

У меня следующий урок. Я хочу сохранить _my_var = Нет, если пользователь не предоставляет для этого значения. Они могут использовать сеттер для его настройки, где я применяю некоторую проверку

 class A:
  _my_var = None

  @property
  def my_var(self):
      return self._my_var
   
  @property.setter
  def my_var(self, value)
      # Some validation
      return._my_var = value
 

Я создаю объект в следующем коде

x = A()

Когда я смотрю на атрибуты, которые имеет x

  _my_var: None
 my_var: None
 

Когда я устанавливаю x._myvar = 10 оба my_var параметра и _my_var атрибуты равны 10. У меня есть путаница по этому поводу. ЯВЛЯЕТСЯ ли _my_var полем, а my_var функцией? Как можно сохранить только _my_var в качестве атрибута, принудив установщика установить его?

Комментарии:

1. Не могли бы вы, пожалуйста, уточнить, о чем вы спрашиваете? Экземпляр x не имеет атрибута my_var — у него есть свойство. Как вы смотрите на атрибуты?

2. я использовал dir(x) для проверки

Ответ №1:

Это потому, что вы создали my_var свойство , но оно возвращается в функции self._my_var , поэтому, если вы измените значение self._my_var на 10 , а затем my_var снова вызовете функцию, она вернет измененное self._my_var значение.

Установка my_var функции в значение a @property может сбить вас с толку, она действует так, как будто это просто атрибут класса, но на самом деле это функция, просто она вызывается без скобок. Если вы сделаете это обычной функцией без @property подобных:

     def my_var(self):
        return self._my_var
  
 

Тогда было бы более очевидно, что это функция, потому что вы назвали бы ее так:

 x._myvar = 10
print(x.my_var())
 

Дал бы:

 10
 

Это сделало бы его более очевидным.

Чтобы он не менялся в соответствии с _my_var , измените функцию на переменную, поэтому вместо:

     def my_var(self):
        return self._my_var
 

Сделай это:

     self.my_var = int(self._my_var)
 

Комментарии:

1. Это правильный способ добавить сеттер для частного атрибута? правильно ли преобразование имен. Имя параметра: _my_var, Имя установщика свойств: my_var()?

2. @Малинта конечно. Это типично

3. @Malintha Да, добавлено дополнительное объяснение по этому поводу.