Почему не все имена в 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__ может использоваться вместо более ранних версий.

Другие вопросы по тегам