Почему свойства должны быть атрибутами класса в Python?

Недавно я узнал об управляемых атрибутах в Python, а общая тема со свойствами и дескрипторами заключается в том, что они должны быть назначены как атрибуты класса. Но нигде я не могу найти объяснения, почему и особенно почему они не могут быть назначены как атрибуты экземпляра. Таким образом, мой вопрос состоит из двух частей:

  • почему экземпляры свойств / дескрипторов должны быть атрибутами класса?
  • почему экземпляры свойств / дескрипторов не являются атрибутами экземпляра?

2 Solutions collect form web for “Почему свойства должны быть атрибутами класса в Python?”

Это связано с тем, как Python пытается разрешить атрибуты:

  1. Сначала он проверяет, определено ли это на уровне класса
  2. Если да, то он проверяет, является ли это свойством или дескриптором данных
  3. Если да, то следует этот «путь»,
  4. Если нет, он проверяет, является ли это простой переменной класса (до ее родительских классов, если таковые имеются)
  5. Если да, он проверяет, что экземпляр переопределяет это значение атрибута класса, если да, он возвращает значение переопределения, если оно не возвращает значение атрибута класса
  6. Если нет, он проверяет, объявляет ли этот атрибут этот атрибут
  7. Если да, он возвращает значение атрибута экземпляра
  8. Если нет, он выбрасывает AttributeError

Voila 😉

РЕДАКТИРОВАТЬ

Я просто нашел эту ссылку, которая объясняет это лучше меня.

Еще одна хорошая иллюстрация .

почему экземпляры свойств / дескрипторов должны быть атрибутами класса?

Им не обязательно быть, они просто есть. Это было дизайнерское решение, у которого, вероятно, есть еще много причин для его резервного копирования, чем я могу думать (упрощая реализацию, отделяя классы от объектов).

почему экземпляры свойств / дескрипторов не являются атрибутами экземпляра?

Они могут быть, вы всегда можете переопределить __getattribute__ , чтобы ссылаться на любые дескрипторы, доступные на экземпляре, или вообще запрещать их, если хотите.

Имейте в виду, что тот факт, что Python не остановит вас от этого, не означает, что это хорошая идея.

  • Запись в новый файл, если он не существует, и добавление к файлу, если оно
  • У Python 3 есть модуль LDAP?
  • Синтаксис Python3 в PyCharm
  • Веб-структура для Python 3
  • Почему библиотека asyncio медленнее, чем потоки для этой операции ввода-вывода?
  • Как закодировать текст на base64 в python
  • Подклассификация встроенных типов в Python 2 и Python 3
  • Почему здесь возникает ссылка IndentationError, а не SyntaxError?
  • Как я могу узнать больше о внутренних компонентах Python?
  • Подключение к серверу Sql с помощью Python 3 в Windows
  • ImportError: ни один модуль с именем pip при попытке установить пакеты
  • Python - лучший язык программирования в мире.