为什么dir()函数没有列出一些可调用的属性?

时间:2010-11-05 17:14:36

标签: python itunes win32com

为什么Python中的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 个答案:

答案 0 :(得分:7)

在python中,对象可以有__getattr__方法。对于不存在的属性,将对任何属性访问调用它。看起来这个对象正在使用_prop_map_get_作为__getattr__的实现的一部分。

由于__getattr__可以进行任意计算以满足属性请求,并且可以为其无法处理的名称引发AttributeError,因此无法从外部列出所有可用的属性。

答案 1 :(得分:3)

好的。 Dir()确实正常运行,行为可以解释。

位置是currentTrack的属性,但只能通过currentTrack._prop_map_get_访问。可调用的_prop_map_get_列在dir(currentTrack)中。请参阅 getattr ,这是一些如何映射到currentTrack._prop_map_get _

你会在win32com中发现各种这样的情况,这是一个包装器。