Почему не все имена в dir (x) допустимы для доступа к атрибутам?
-
20-08-2019 - |
Вопрос
Зачем программисту запихивать что-то в __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__
может использоваться вместо этого для более ранних версий.