我想知道当我不知道类的所有名称时最好的方法是什么。

假设我有:

#!/usr/bin/python2.4

class A(object):
    outerA = "foobar outerA"
    def __init__(self):
        self.innerA = "foobar innerA"

class B(A):
    outerB = "foobar outerB"
    def __init__(self):
        super(B, self).__init__()
        self.innerB = "foobar innerB"

if __name__ == '__main__':
    b = B()


使用hasattr / getattr获取我的b实例的“ outerA”类字段可以正常工作:

>>> print hasattr(b, "outerA")
>>> True

>>> print str(getattr(b, "outerA"))
>>> foobar outerA


好的,那很好。

但是,如果我不完全知道b继承了一个名为“ outerA”的字段,但我仍然想得到它怎么办?

要访问b的内部字段,通常使用b.__dict__。要获取b.outerB,我可以使用b.__class__.__dict__,但是在其中的字段中仍然不显示“ outerA”:

>>> print "-------"
>>> for key, val in b.__class__.__dict__.iteritems():
...     print str(key) + " : " + str(val)
>>> print "-------\n"


显示:

-------
__module__ : __main__
__doc__ : None
__init__ : <function __init__ at 0xb752aaac>
outerB : foobar outerB
-------


我的outerA在哪里? :D

我确定我可以继续“爬升”类层次结构并获取所有字段,但这似乎不是最大的解决方案...

就像有hasattr()一样,getattr()...像listattr()这样的东西不提供实例的所有可用属性吗?

谢谢!

最佳答案

尝试dir(b)。结果列表包括继承的属性。

09-06 20:19