使用__dict __-访问Python实例变量是不是错了?

时间:2011-01-18 18:17:24

标签: python

如果我想访问对象的实例变量列表,我可以调用myObject.__dict__.keys()。我想使用此属性打印出对象的所有实例变量。我对此犹豫不决,因为__dict__是一个“秘密”属性,我不明白this footnote的含义。

使用myObject.__dict__是错误的吗?

5 个答案:

答案 0 :(得分:6)

脚注的含义是您不应该尝试直接访问__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()是正确的方法。

答案 1 :(得分:5)

该脚注引用了模块__dict__属性。对象的__dict__属性不会发出此类警告(documentation)。

答案 2 :(得分:4)

您可以使用dir函数列出对象的所有属性。

答案 3 :(得分:3)

将它用于打印成员以进行调试之类的事情应该没问题。但如果这就是你所做的一切,请查看漂亮的印刷品。

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

__dict__的主要问题是它违反了python所拥有的对象的隐含可见性规则。

答案 4 :(得分:-2)

根据该脚注,__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']