访问父类的类属性

2 投票
2 回答
2136 浏览
提问于 2025-04-16 06:37

我想知道在不知道类的属性名称时,获取所有属性的最佳方法是什么。

假设我有:

#!/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() 的东西,可以给出一个实例的所有可用属性吗?

谢谢!

2 个回答

2

我觉得你在找的是 dir() 这个东西——它在代码里用和在命令行里用效果是一样的。

1

试试 dir(b)。这个命令会给你一个列表,里面包含了所有继承的属性。

撰写回答