如果我想访问对象的实例变量列表,我可以调用myObject.__dict__.keys()
。我想使用此属性打印出对象的所有实例变量。我对此犹豫不决,因为__dict__
是一个“秘密”属性,我不明白this footnote的含义。
使用myObject.__dict__
是错误的吗?
答案 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']