Почему не все имена в dir (x) допустимы для доступа к атрибутам?

StackOverflow https://stackoverflow.com/questions/485095

Вопрос

Зачем программисту запихивать что-то в __dict__ это не может быть использовано для доступа к атрибутам?Например, в моем экземпляре Plone, dir(portal) включает в себя index_html, но portal.index_html вызывает ошибку атрибута.Это также верно для __class__ атрибут Products.ZCatalog.Catalog.mybrains.Есть ли веская причина, почему dir() нельзя доверять?

Ковыряясь в inspect модуль, я вижу, что они используют object.__dict__['x'] вместо доступа к атрибутам по этой причине и потому, что они не хотят запускать getattr Магия.

Это было полезно?

Решение

Я не знаю о Plone, поэтому следующее носит общий характер.

От документы из dir:

Если у объекта есть метод с именем __dir__(), этот метод будет вызван и должен вернуть список атрибутов .Это позволяет объектам, которые реализуют пользовательский __getattr__() или __getattribute__() функция для настройки способа dir() сообщает об их атрибутах.

Здесь я просто предполагаю, но я могу думать о двух вещах, которые могут происходить--

  • Объект имеет __dir__() метод, который возвращает атрибуты, которых у него нет

  • (менее вероятно) Объект имеет атрибут, который вы запрашиваете (т.е.это в obj.__dict__ или type(obj).__dict__, но переопределяет __getattr__ чтобы вернуться AttributeError

Редактировать: __dir__ поддерживается только в Python 2.6+, однако (устаревшие) специальные атрибуты __methods__ и __members__ может использоваться вместо этого для более ранних версий.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top