到目前为止,这是我的代码,
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_']
为什么会这样?
更新
无论如何,我可以理解对象的所有属性吗?
答案 0 :(得分:7)
根据此页http://docs.python.org/2/library/functions.html#dir
因为提供dir()主要是为了方便使用 交互式提示,它试图提供一组有趣的名称 不只是它试图提供严格或一致定义的集合 名称及其详细行为可能会在不同版本中发生变化。对于 例如,元类属性不在结果列表中 论证是一个阶级。
因此,我们不应该依赖dir
来了解一个对象。如果该类实现__dir__
方法,我们将只获得从该方法返回的任何内容。他们可能已实施__dir__
并从body
来电中抽象dir
。
示例:强>
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']
答案 1 :(得分:1)
尝试使用__dict__
方法。正如它在文档中指定的那样,它列出了所有可写属性,因此可能有所帮助。
答案 2 :(得分:0)
答案是否,因为in this case可以覆盖对象的__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