2010-11-05 32 views
5

Python中的dir()函數怎麼沒有顯示所有的可調用屬性?爲什麼dir()函數沒有列出一些可調用的屬性?

import win32com.client 

iTunes = win32com.client.gencache.EnsureDispatch("iTunes.Application") 
currentTrack = win32com.client.CastTo(iTunes.CurrentTrack,"IITFileOrCDTrack") 

print dir(currentTrack) 

結果:

['AddArtworkFromFile', 'CLSID', 'Delete', 'GetITObjectIDs', 'Play', 'Reveal', 'UpdateInfoFromFile', 'UpdatePodcastFeed', '_ApplyTypes_', '__doc__', '__eq__', '__getattr__', '__init__', '__module__', '__ne__', '__repr__', '__setattr__', '_get_good_object_', '_get_good_single_object_', '_oleobj_', '_prop_map_get_', '_prop_map_put_', 'coclass_clsid'] 

print currentTrack.Location 

位置是可調用和返回的文件路徑,而不是在第一個結果列。它也不會顯示代碼完成工具。是因爲它是通過getter方法獲取的嗎?我看到它列在_prop_map_get_和_prop_map_put_下。當currentTrack._prop_map_get _ ['Location']返回「(1610874880,2,(8,0),(),'Location',None)?」時,爲什麼currentTrack.Location返回文件路徑?它在哪裏得到文件路徑字符串?

回答

2

好的。 Dir()確實正常工作,行爲是可以解釋的。

位置是currentTrack的屬性,但只能通過currentTrack._prop_map_get_訪問。可調用_prop_map_get_列在dir(currentTrack)中。見getattr這是一些如何映射到currentTrack._prop_map_get_

你會發現在win32com這是一個包裝的各種這種情況。

5

在Python中,對象可以有一個__getattr__方法。它將被調用用於不存在的屬性的任何屬性訪問。看起來這個對象使用_prop_map_get_作爲其執行__getattr__的一部分。

由於__getattr__可以進行任意計算以滿足屬性請求,並且可以爲其無法處理的名稱提出AttributeError,因此從外部無法列出所有可用的屬性。

+0

+1瞭解這一點的時候,燈泡真的繼續我的頭爲Python(好吧,一般的動態語言...) – bgporter 2010-11-05 17:23:23

+0

我很好奇,如何PythonWin可以給我一個完整的屬性列表完成使用'COMObject'實例,以及是否可以在Python代碼中執行相同的操作,或者是否執行win32com軟件包不公開的任何操作。 – geoffspear 2012-08-08 15:02:10

相關問題