Доступ к переменным экземпляра 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']