Почему не все имена в dir (x) действительны для доступа к атрибутам? - PullRequest
3 голосов
/ 27 января 2009

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

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

1 Ответ

2 голосов
/ 28 января 2009

Я не знаю о Plone, поэтому следующее является общим.

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

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

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

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

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

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

...