#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 Да, добавлено дополнительное объяснение по этому поводу.