2011-08-30 46 views
2

那麼有可能只獲取最特定類的屬性的字典/列表?到目前爲止,我正在使用python只獲得類屬性沒有超類

for attr, value in obj.__class__.__dict__.iteritems(): 

但是,這也會給我在超類定義的屬性。有什麼辦法可以避免這種情況?

回答

3

摘自python documentation

類有一個用字典對象實現的名字空間。類 屬性引用被翻譯爲本字典中的查找,例如,Cx被翻譯爲C .__ dict __ [「x」](儘管對於新式 類特別存在一些鉤子,其允許 其他手段定位屬性)。當屬性名是沒有找到 ,屬性搜索的基類

換句話說繼續,__dict__包含類的只是「局部」的屬性,超類的屬性存儲在超__dict__。

因此,您可以使用__class__.__dict__.iteritems()來僅檢索類屬性。

1

它不顯示我的父類的屬性:

>>> class A(object): 
    def a(self): 
     print a 
    b = 3 

>>> a = A() 
>>> dir(a) 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'b'] 
>>> list(a.__class__.__dict__) 
['a', '__module__', 'b', '__dict__', '__weakref__', '__doc__'] 

__module____dict____weakref____doc__似乎是在默認情況下每個類創建的屬性。

的默認屬性此列表不同的舊式類:

>>> class B: 
    pass 

>>> list(B().__class__.__dict__) 
['__module__', '__doc__'] 
1

如果你想獲得的所有類的屬性和它們的值,包括繼承類的字典,那麼你可能需要使用下面的代碼:

cls_dict = { attr: getattr(obj.__class__, attr) 
      for attr in dir(obj.__class__) } 
for attr, val in cls_dict.iteritems(): 
    logging.info("%s = %s", attr, val)