Декоратор свойств Python не работает, почему?

#python #python-2.7 #properties

#python #python-2.7

Вопрос:

По какой-то причине ‘obj._max_value’ и ‘obj._current_value’ не устанавливаются. Я просмотрел много руководств, и кажется, что я делаю это правильно. Кто-нибудь знает, почему он не работает?

Смотрите Код: https://gist.github.com/matthew-campbell/5561562

(Python 2.7)


Обновить:

 class Progress():

  @property
  def progress_bar_length(self):
    return self._progess_bar_length

  @progress_bar_length.setter
  def progress_bar_length(self, length):
    self._progress_bar_length = length

  @progress_bar_length.deleter
  def progress_bar_length(self):
    del self.progress_bar_length
  

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

1. Не используйте огромные, в основном нерелевантные примеры кода и, безусловно, не размещайте ссылки на Gist. Рекомендуется свести вашу проблему к ее основам и опубликовать образец кода (настолько простой, насколько это возможно) в вашем вопросе. Ваша проблема могла быть легко продемонстрирована с помощью <10 строк кода.

Ответ №1:

property Декоратор не работает с классами старого стиля. Унаследуйте свой класс от object , чтобы получить класс нового стиля:

 class Progress(object):
    # ...
  

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

1. @MattCampbell Кроме того, Python — это не Java. Скорее всего, вам не нужны все эти свойства, они служат только для замедления работы вашей программы и усложняют ее обслуживание (из-за множества ненужных шаблонов).

2. @user4815162342 Почему ты так говоришь? Я нахожу это удобным в использовании. Откуда вы знаете, что это замедляет работу компьютера?

3. Свойства @Valentyn хороши, когда они действительно имеют смысл в вашей программе, но вам не нужно использовать их везде , например, чтобы выставить «частный» слот как «общедоступное» свойство. Это замедляет работу программы (а не компьютера!) потому что интерпретируется CPython, поэтому нет JIT-компилятора для встроенных вызовов всех этих функций доступа. Кроме того, в Python вы всегда можете начать с общедоступного атрибута и перенести его в свойство позже без потери совместимости с API. Нет причин использовать свойство, потому что вам может понадобиться добавить логику в будущем — вы добавите ее, если / когда она вам действительно понадобится.