列出类继承的所有属性

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)

tso*_*tso 5

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__是一个包含此类的基类元组的类属性.因此,如果您的类只有一个基类,这就是答案,但如果类有多个基类,则对该元组中的所有元素执行相同操作.

  • `getAttributes()` 方法从何而来? (4认同)

Rig*_*leg 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()
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)