您好,我正在尝试使用在StackOverflow上获取的代码从Outlook中提取数据。
使用第一个循环,我试图收集对象可用的所有属性。
在运行它的同时,我注意到缺少Name,后来在第二个循环中调用,我认为这是由于继承。请问你能帮助我找到课堂上的所有属性吗?
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()
答案 0 :(得分:5)
Python提供了一个方便的小内置函数dir。我可以在类实例上使用它来获取该类的所有属性和方法的列表以及一些继承的魔术方法,例如__delattr__,
__dict__
,__doc__
,{{1您可以通过执行以下操作自己尝试:
__format__
但你想要的是:
x = dir(myClassInstance)
child.__class__.__bases__[0]().getAttributes()
是一个类属性,包含此类的基类元组。因此,如果您的类只有一个基类,那么这就是答案,但如果类有多个基类,则对该元组中的所有元素执行相同操作。
答案 1 :(得分:4)
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']
答案 2 :(得分:4)
dir(contacts)
会显示contacts
的所有属性名称。
我注意到没有Name,后来在第二个循环中调用了
您使用j.Name
而非contacts.Name
,因此Name
没有理由从第一个循环中显示出来。如果您想知道j
上的所有可用属性,请执行dir(j)
。
答案 3 :(得分:3)
给定两个类,Parent和Child,如果只想要继承的属性,可以使用inspect模块和dictreader = csv.DictReader(reader)
for k in dictreader:
print(k) # Prints all keys/values
for i in dictreader:
print(i) # Doesn't print anything
:
dir
你可以按照自己希望的方式进入层次结构