Kri*_*shn 10 python inheritance gal python-3.x
嗨,我有以下从我尝试使用在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()
Run Code Online (Sandbox Code Playgroud)
Python提供了一个方便的小内置函数dir.我可以使用一个类的实例来获得所有属性,并与一些遗传神奇的方法,比如沿着类的方法列表__delattr__, __dict__,__doc__,__format__等,您可以通过以下操作自己试用:
x = dir(myClassInstance)
Run Code Online (Sandbox Code Playgroud)
但你想要的是:
child.__class__.__bases__[0]().getAttributes()
Run Code Online (Sandbox Code Playgroud)
__bases__是一个包含此类的基类元组的类属性.因此,如果您的类只有一个基类,这就是答案,但如果类有多个基类,则对该元组中的所有元素执行相同操作.
super指的是母类的实例。
返回一个代理对象,该对象将方法调用委托给该类型的父类或同级类。这对于访问类中已重写的继承方法很有用。
dir返回参数属性的列表。
使用参数,尝试返回该对象的有效属性列表。
class Foo:
def __init__(self):
self.v = 10
class Bar(Foo):
def __init__(self):
super().__init__()
print(dir(super()))
b = Bar()
Run Code Online (Sandbox Code Playgroud)
输出:
[(...), 'v']
Run Code Online (Sandbox Code Playgroud)
输出列表包含母类中定义的所有属性。它主要包含继承自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']
Run Code Online (Sandbox Code Playgroud)