2011-07-20 62 views
18

任何人能有足夠的例子向我解釋什麼區別的B/Winspect.getmembers()VS __dict __。項目()VS目錄()

>>> import inspect 
>>> inspect.getmembers(1) 

>>> type(1).__dict__.items() 

>>> dir(1) 

不同之處在於它們按照該順序顯示屬性&的降序no.s。 1是整數(但它可以是任何類型的。)


編輯

>>>obj.__class__.__name__ #gives the class name of object 
>>>dir(obj)    #gives attributes & methods 
>>>dir()     #gives current scope/namespace 
>>>obj.__dict__   #gives attributes 
+1

根據你的目的,你可能想要再次編輯最後一個塊,替換其他對象(比如obj)的對象,並將最後一個註釋從「給予屬性」改爲「給出_instance_屬性」 - - 當'dir(obj)'基本上「包含繼承」時,'obj .__ dict __。keys()'不會 –

回答

18

dir()允許您自定義哪些屬性的對象的報告,通過定義__dir__()

從手動,如果__dir__()沒有定義:

如果對象是一個模塊對象,列表中包含的模塊的屬性的名稱。

如果對象是一個類型或類對象,則該列表包含其屬性的名稱,並遞歸地顯示其基的屬性。

否則,該列表將包含對象的屬性名稱,其類屬性的名稱以及其類的基類的屬性的遞歸。

這也是inspect.getmembers()返回的結果,除了它返回(name, attribute)的元組而不僅僅是名稱。

object.__dict__是形式的字典{key: attribute, key2: atrribute2}

object.__dict__.keys()有另外兩個是缺乏的。

從文檔上inspect.getmembers()

getmembers()不返回時,該參數是一個類(這種行爲是從DIR()函數繼承)元類屬性。

對於int.__dict__.keys(),這是

['__setattr__', '__reduce_ex__', '__reduce__', '__class__', '__delattr__', '__subclasshook__', '__sizeof__', '__init__'] 

總之,dir()inspect.getmembers()基本上是相同的,而__dict__是完整的命名空間,包括元類的屬性。