Почему не все имена в dir(x) действительны для доступа к атрибутам?
Зачем кодеру вставлять вещи в __dict__
что нельзя использовать для доступа к атрибутам? Например, в моем экземпляре Plone, dir(portal)
включает в себя index_html
, но portal.index_html
поднимает AttributeError. Это также верно для __class__
атрибут Products.ZCatalog.Catalog.mybrains
, Есть ли веская причина, почему dir()
нельзя доверять?
Ковыряться inspect
модуль, я вижу, они используют object.__dict__['x']
вместо доступа к атрибутам по этой причине и потому, что они не хотят запускать getattr
магия.
1 ответ
Я не знаю о Плоне, поэтому следующее является общим.
Из документов dir
:
Если у объекта есть метод с именем
__dir__()
, этот метод будет вызван и должен вернуть список атрибутов. Это позволяет объектам, которые реализуют пользовательские__getattr__()
или же__getattribute__()
функция, чтобы настроить способdir()
сообщает свои атрибуты.
Просто думаю, но я могу вспомнить две вещи, которые могут происходить:
Объект имеет
__dir__()
метод, который возвращает атрибуты, которых у него нет(менее вероятно) У объекта есть атрибут, который вы запрашиваете (т.е. он находится в
obj.__dict__
или жеtype(obj).__dict__
, но переопределяет__getattr__
возвращатьAttributeError
РЕДАКТИРОВАТЬ: __dir__
поддерживается только в Python 2.6+, однако (не рекомендуется) специальные атрибуты __methods__
а также __members__
может использоваться вместо более ранних версий.