Доступ к переменным экземпляра Python с __dict __- Неправильно ли это?

Если я хочу получить доступ к списку переменных экземпляра объекта, я могу вызвать myObject.__dict__.keys(). Я хочу использовать этот атрибут для печати всех переменных экземпляра объекта. Я не решаюсь это сделать, потому что __dict__ является "секретным" атрибутом, и я не понимаю, что означает эта сноска.

Неправильно ли использовать myObject.__dict__?

Ответы

Ответ 1

Что означает сноска, так это то, что вы не должны пытаться напрямую обращаться к __dict__, а вместо этого проверяете, доступна ли функция/поведение, которое вы хотите.

Итак, вместо того, чтобы делать что-то вроде:

if "__some_attribute__" in obj.__dict__:
    # do stuff

вы должны сделать:

try:
    obj.some_action_i_want_to_do(...)
except AttributeError:
    # doesn't provide the functionality I want

Причины этого связаны с тем, что разные объекты могут предоставлять разные внутренние ссылки на определенное действие, но все же обеспечивают желаемый результат.

Если вы хотите перечислить "внутренности" для отладки и проверки текущего объекта, то dir() является правильным способом для этого.

Ответ 2

Эта сноска относится к атрибуту __dict__ модуля. Атрибут __dict__ объекта не несет такого предупреждения (документация).

Ответ 3

Вы можете использовать dir для отображения всех атрибутов объекта.

Ответ 4

Использование этого для таких вещей, как распечатка элементов для отладки, должно быть прекрасным. Но если это все, что вы делаете, посмотрите довольно печатную версию.

http://docs.python.org/library/pprint.html

Основная проблема с __dict__ заключается в нарушении правил видимости объектов, которые имеет python.

Ответ 5

Согласно этой сноске, __dict__ существует только для объектов модуля.

То, что вы ищете, возможно, встроенная функция dir(). Например:

>>> f = open('foo', 'w')
>>> dir(f)
['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines']