2010-11-05 264 views
2

我想知道當我不知道它們的名稱時,獲取類的所有屬性的最佳方式是什麼。訪問父類的類屬性

比方說,我有:

#!/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」 中的IT領域:

>>> 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()這將提供一個實例的所有可用屬性?

謝謝!

回答

1

嘗試dir(b)。結果列表包含繼承的屬性。

+0

So cooool !!!這就是我需要的! – BorrajaX 2010-11-05 17:02:18

2

我認爲您正在尋找dir() - 它在代碼中的工作方式與在shell中一樣。