访问父类的类属性
我想知道在不知道类的属性名称时,获取所有属性的最佳方法是什么。
假设我有:
#!/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)
。这个命令会给你一个列表,里面包含了所有继承的属性。