繁体   English   中英

dir并且不帮助在python中显示对象的所有属性?

[英]dir and help not showing all attributes of an object in python?

到目前为止这是我的代码,

import win32com.client as winc

outlook = winc.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items
message = messages.GetLast()
print message.body

message.body从outlook打印我的最后一封电子邮件。

当我dir(message)help(message) ,属性body不会来。 为什么?

>>> dir(message)
['_ApplyTypes_', '_FlagAsMethod', '_LazyAddAttr_', '_NewEnum', '_Release_', '__AttrToID__', '__LazyMap__', '__call__', '__doc__', '__eq__', '__getattr__', '__getitem__', '__init__', '__int__', '__len__', '__module__', '__ne__', '__nonzero__', '__repr__', '__setattr__', '__setitem__', '__str__', '_builtMethods_', '_enum_', '_find_dispatch_type_', '_get_good_object_', '_get_good_single_object_', '_lazydata_', '_make_method_', '_mapCachedItems_', '_oleobj_', '_olerepr_', '_print_details_', '_proc_', '_unicode_to_string_', '_username_', '_wrap_dispatch_']

为什么是这样?

更新

无论如何,我可以毫无疑问地了解对象的所有属性吗?

根据此页面http://docs.python.org/2/library/functions.html#dir

因为dir()主要是为了方便在交互式提示中使用而提供的,所以它尝试提供一组有趣的名称,而不是尝试提供严格或一致定义的名称集,并且其详细行为可能会在不同版本之间发生变化。 例如,当参数是类时,元类属性不在结果列表中。

所以,我们不应该依赖dir来了解一个对象。 如果该类实现__dir__方法,我们将只获取从该方法返回的任何内容。 他们可能已经实现了__dir__并从dir调用中抽象出了body

例:

class TestClass:
    def __init__(self):
        self.myValue = 0
    def myMethod(self):
        pass
    def __dir__(self):
        return []

class TestClass1:
    def __init__(self):
        self.myValue = 0
    def myMethod(self):
        pass

print dir(TestClass())
print dir(TestClass1())

print dir(TestClass())
print dir(TestClass1())

产量

[]
['__doc__', '__init__', '__module__', 'myMethod', 'myValue']

尝试使用__dict__方法。 正如在docs中指定的那样,它列出了所有可写属性,因此可能有所帮助。

答案为 ,因为在这种情况下 ,可以覆盖对象的__getattr__方法。 考虑以下示例:

>>> class Const(object):
...     def __init__(self, val):
...         self.value = val
...     def __getattr__(self, a):
...         return self.value
...     def __setattr__(self, a, v)
...         self.__dict__[a] = v
...
>>> c = Const(1)
>>> dir(c)
['__class__', '__delattr__', '__dict__',  '__doc__', '__format__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'value']
>>> c.__dict__
{'value': 1}
>>> c.some_strange_attribute_name
1
>>> c.some_strange_attribute_name = 2
>>> c.some_strange_attribute_name
2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM