12

嗨,我有以下内容,我正在尝试使用 StackOverflow 上获得的代码从 Outlook 中提取数据。

使用第一个循环,我试图收集对象可用的所有属性。

在运行它时,我注意到后来在第二个循环中调用的名称的缺失,我认为这是由于继承。请你能帮我找到一个类可用的所有属性吗?

import win32com.client,sys

o = win32com.client.gencache.EnsureDispatch("Outlook.Application")
ns = o.GetNamespace("MAPI")

adrLi = ns.AddressLists.Item("Global Address List")
contacts = adrLi.AddressEntries
numEntries = adrLi.AddressEntries.Count
print(type(contacts))
nameAliasDict = {}
attrs_ = dir(contacts)
for i in range(len(attrs_)):
    print((attrs_[i]))

for j in contacts:
    print(j.Name)

    sys.exit()
4

4 回答 4

6

Python 提供了一个方便的小内置函数,称为 dir。我可以在类实例上使用它来获取该类的所有属性和方法以及一些继承的魔术方法的列表,例如__delattr__, __dict__, __doc__,__format__等。您可以通过执行以下操作自己尝试:

x = dir(myClassInstance)

但你想要的是:

child.__class__.__bases__[0]().getAttributes()

__bases__是一个包含此类基类元组的类属性。因此,如果您的类只有一个基类,这就是答案,但如果类有多个基类,只需对该元组中的所有元素执行相同操作即可。

于 2017-05-25T18:57:36.567 回答
4

dir(contacts)将向您显示contacts.

我注意到没有 Name 稍后在第二个循环中调用

你使用j.Namenotcontacts.Name所以没有理由Name从第一个循环中出现。如果您想了解所有可用属性,j请执行dir(j).

于 2017-05-19T22:32:08.217 回答
4

使用superdir内置函数。

super指的是母类的实例。

返回一个代理对象,它将方法调用委托给类型的父类或同级类。这对于访问已在类中重写的继承方法很有用。

dir返回参数属性的列表。

使用参数,尝试返回该对象的有效属性列表。

class Foo:
    def __init__(self):
        self.v = 10

class Bar(Foo):
    def __init__(self):
        super().__init__()
        print(dir(super()))

b = Bar()

输出:

[(...), 'v']

输出列表包含在母类中定义的所有属性。它主要包含继承自object(双下划线之间的属性)的属性。


如果您不扩展您想知道属性的类,只需dir在实例上使用:

>>> dir(Foo())
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'v']
于 2017-05-17T15:30:21.640 回答
3

给定两个类,Parent 和 Child,如果你只想要继承的属性,你可以使用inspect模块加上dir

import inspect

class Parent():
    a = 1

    def myfunc(self):
        return 2

class Child(Parent):

    c = 4


mros = inspect.getmro(Child) #returns a tuple with the class in parameter at the first position, the rest should be the parent class(es)
child_attrs = dir(mros[0])
parent_attrs = dir(mros[1])

inherited_attr = [item for item in child_attrs if item in parent_attrs]

print(parent_attrs)
print(child_attrs)
print(inherited_attr)

你可以像这样进入层次结构,但是你愿意

于 2017-05-24T19:40:56.807 回答